référencement Mysql tables dérivées de requêtes imbriquées
-
26-10-2019 - |
Question
j'ai posté quelque chose de similaire à hier, mais maintenant je voudrais quelque chose d'un peu différent de ma requête -
Je suis en train d'interroger une base de données pour récupérer le nombre d'utilisateurs uniques qui ont visité un site Web au fil du temps. Les looks de données quelque chose comme ceci:
Day | UserID
1 | A
1 | B
2 | B
3 | A
4 | B
4 | C
5 | D
Je voudrais que le résultat de la requête de regarder ce ce
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
Le résultat est 2,1,0,1,2 parce que, à la fin de ces jours-là, il y a un nombre X d'utilisateurs qui ont visité une seule fois. par exemple. jour 5, à la fin du jour 5, les utilisateurs c et d ont visité qu'une seule fois chacun.
Je pense que je suis à la recherche d'une requête semblable à ceci:
select d.day, (select count(distinct userid) from visits where day<=d.day)
from (select distinct day from visits) d
La différence entre la requête ci-dessus et ce que je suis à la recherche est que je voudrais cette nouvelle requête de ne considérer que les utilisateurs une seule fois pour chaque période de temps, et ne pas répéter les utilisateurs.
Merci
La solution
Cette sous-requête devrait fonctionner pour les exigences clarifiées.
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
Vous devez avoir pris l'idée de SQL Server - il est le seul SGBDR (IIRC) qui vous permettra de référencer une requête deux fois enlevé (de nidification). S'il vous plaît indiquer ce que vous voulez et nous pouvons réécrire la requête.
Pour la dernière requête affichée, vous n'avez pas besoin de 2 niveaux de sous-requête
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;