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

Était-ce utile?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top