Mesas derivadas de refención mysql de consultas anidadas
-
26-10-2019 - |
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
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;