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

È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top