Mysql riferimento le tabelle derivate da interrogazione annidata
-
26-10-2019 - |
Domanda
ho postato qualcosa di simile a ieri, ma ora vorrei qualcosa di un po 'diverso dal mio interrogazione -
Sto cercando di interrogare un database per recuperare il numero di utenti di una volta che hanno visitato un sito web nel corso del tempo. Gli sguardi di dati simile a questa:
Day | UserID
1 | A
1 | B
2 | B
3 | A
4 | B
4 | C
5 | D
Mi piacerebbe il risultato della query di guardare questo questo
Time Span | COUNT(DISTINCT UserID)
Day 1 to Day 1 | 2
Day 1 to Day 2 | 1
Day 1 to Day 3 | 0
Day 1 to Day 4 | 1
Day 1 to Day 5 | 2
Il risultato è 2,1,0,1,2 perché, al termine di quei giorni, ci sono un numero X di utenti che hanno visitato una sola volta. per esempio. per il giorno 5, al termine della giornata 5, gli utenti C e D hanno visitato solo una volta.
Credo che sto cercando una query simile a questo:
select d.day, (select count(distinct userid) from visits where day<=d.day)
from (select distinct day from visits) d
La differenza tra la query di cui sopra e quello che sto cercando è che mi piacerebbe questa nuova query di prendere in considerazione solo gli utenti di una volta per ogni periodo di tempo, e non ripetere gli utenti.
Grazie
Soluzione
Questa sottoquery dovrebbe funzionare per le esigenze chiariti.
select d.day, count(distinct case when b.userid is null then a.userid end)
from (select day from visits group by day) d
inner join
(
select a.day, a.userid, count(*) c
from visits a
join visits b on a.userid=b.userid and b.day <= a.day
group by a.day, a.userid
having count(*) = 1
) a on a.day <= d.day
left join
(
select a.day, a.userid, count(*) c
from visits a
join visits b on a.userid=b.userid and b.day <= a.day
group by a.day, a.userid
having count(*) > 1
) b on a.userid = b.userid and b.day <= d.day
group by d.day
Original
Si deve aver preso l'idea da SQL Server - è l'unico RDBMS (IIRC) che vi permetterà di fare riferimento a (nidificazione) di query due volte rimosso. Si prega di indicare quello che vuoi e possiamo riscrivere la query.
Per la query esatto mostrato, non hai bisogno di 2 livelli di subquery
SELECT
C.col_c1 AS Data,
(
SELECT count(col_b1)
FROM tbl
WHERE col_b2 <= C.col_c1
) A
FROM (
SELECT col_c1 # subquery to get distinct c1
FROM tbl
GROUP BY col_c1) C;