Pregunta

Publiqué algo similar a esto ayer, pero ahora me gustaría algo un poco diferente de mi consulta-

Estoy tratando de consultar una base de datos para recuperar el número de usuarios únicos que han visitado un sitio web con el tiempo. Los datos se parecen a esto:

Day | UserID  
  1 | A  
  1 | B  
  2 | B  
  3 | A  
  4 | B  
  4 | C  
  5 | D  

Me gustaría el resultado de la consulta para ver esto esto

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  

El resultado es de 2,1,0,1,2 porque, al final de esos días, hay x número de usuarios que han visitado una sola vez. Por ejemplo, para el día 5, al final del día 5, los usuarios C y D han visitado solo una vez cada uno.

Creo que estoy buscando una consulta similar a esta:

select d.day, (select count(distinct userid) from visits where day<=d.day)
from (select distinct day from visits) d

La diferencia entre la consulta anterior y lo que estoy buscando es que me gustaría que esta nueva consulta considere solo usuarios únicos para cada período de tiempo, y no los usuarios de repetición.

Gracias

¿Fue útil?

Solución

Esta subconsulta debe funcionar para los requisitos aclarados.

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

Debe haber tomado la idea de SQL Server: es el único RDBMS (IIRC) que le permitirá hacer referencia a una consulta dos veces eliminada (anidación). Indique lo que quiere y podemos reescribir la consulta.

Para la consulta exacta que se muestra, no necesita 2 niveles de subconsulta

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top