3 votes

Regrouper par plages de dates (teradata)

J'ai des données comme celles-ci :

Date             User ID
2012-10-11         a
2012-10-11         b
2012-10-12         c
2012-10-12         d 
2012-10-13         e
2012-10-14         b
2012-10-14         e

Ce que je veux faire, c'est regrouper les deux jours les plus récents (dans ma requête réelle, il s'agira de 7 jours) pour chaque jour et obtenir le nombre d'identifiants distincts.

Par exemple, je veux que le résultat ressemble à ceci :

Date             count(distinct userIDs)
2012-10-12         4
2012-10-13         3
2012-10-14         2

Par exemple, pour 2012-10-12, j'obtiens un compte de 4 car j'ai 'a' , 'b' , 'c' y 'd' . ' \==> 'a' y 'b' proviennent de la veille, et 'c' y 'd' proviennent du même jour, 2012-10-12.

De même, pour 2012-10-13, je regarde 2012-10-13 et 2012-10-12 et j'obtiens 'c' , 'd' y 'e' .

Le type de données de la colonne Date est la date. J'utilise Teradata.

J'ai essayé de faire des recherches, mais je n'ai pas encore trouvé de réponse directe qui s'applique à ma situation :-/ Désolé si je me répète. Votre aide est très appréciée. Je vous remercie de votre aide.

2voto

Dan Bracuk Points 9529

Je ne suis pas tout à fait familier avec la syntaxe de Teradata, je vais donc utiliser redbrick pour vous montrer la logique.

select date, count(distinct userid) records
from yourtable
where date >= dateadd(day, -2, current_date)
group by date
order by date 

L'édition commence ici

Après examen, si vous remplacez

where date >= dateadd(day, -2, current_date)

avec

where date >= current_date - 2

alors vous devriez être en mesure de le faire.

2voto

Gordon Linoff Points 213350

Pour faire ce que vous voulez, vous devez en fait "multiplier" les données, car chaque ligne peut être incluse dans deux dates pour l'agrégation finale.

Je pense que l'approche la plus simple consiste à créer un union all l'approche :

select date, count(distinct userId)
from ((select date, UserId
       from t
      ) union all
      (select date + 1, UserId     -- combine with yesterday's data
       from t
      )
     ) t
group by date;

Comme il s'agit de 7 jours, voici une autre approche :

select (t.date + n), count(distinct t.UserId)
from t cross join
     (select 0 as n union all select 1 union all select 2 union all select 3 union all
      select 4 union all select 5 union all select 6
     ) n
group by t.date + n;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X