2017-08-16 1 views
2

J'ai une table qui ressemble à ceci:Agrégation dans SQL

Conversion_Date  User_Name  Last_Date_Touch  Touch_Count 
     7/15/2017    A   6/17/2017    1 
     7/16/2017    B   6/24/2017    2 
     7/19/2017    A   6/20/2017    1 
     7/19/2017    C   6/29/2017    1 

Je veux obtenir la somme des Touch_Count des 30 derniers jours pour chaque Conversion_Date par User_Name dans SQL. La seule chose que je pouvais penser au début était de trouver la fenêtre temporelle pour chaque date de conversion qui remonte à 30 jours et je ne suis pas sûr de savoir comment l'agréger pour obtenir le résultat final.

D'abord, il ajoutait la fenêtre de 30 jours ci-dessous:

Conversion_Date  User_Name  Last_Date_Touch  Touch_Count 30_Days_Ago 
     7/15/2017    A   6/17/2017    1  6/15/2017  
     7/16/2017    B   6/24/2017    2  6/16/2017 
     7/19/2017    A   6/20/2017    1  6/19/2017 
     7/19/2017    C   6/29/2017    1  6/19/2017 

Je dois agréger pour qu'il ressemble à ceci:

Conversion_Date  User_Name  Last_Date_Touch  Touch_Count  SUM(Last30daysbyconversiondate) 
     7/15/2017    A   6/17/2017    1  5 
     7/16/2017    B   6/24/2017    2  5 
     7/19/2017    A   6/20/2017    1  4 
     7/19/2017    C   6/29/2017    1  4 

Les deux derniers ont été 4 parce que la valeur last_date_touch du 17/05/2017 n'était pas dans la fenêtre de 30 jours pour 19/07/2017, de sorte que touch_count a été exclu faisant le nombre total 4 dans ce cas pour les deux dernières lignes.

Toute aide serait utile si vous savez comment faire cela en SQL.

Merci!

Répondre

1

Cela devrait être obtenue avec une jointure réflexive

select 
    a.User_Name 
    ,a.Conversion_Date 
    ,sum(b.Touch_Count) as SumOver30Days 
from 
    SomeTable a 
    left join 
     SomeTable b on 
     b.User_Name = a.User_name 
     --and b.Conversion_Date <= a.Conversion_Date 
     --and b.Conversion_Date >= dateadd(day,-30,a.Conversion_Date) 
     and cast(b.Conversion_Date as date) <= cast(a.Conversion_Date as date) 
     and cast(b.Conversion_Date as date) >= cast(dateadd(day,-30,a.Conversion_Date) as date) 
group by a.User_Name, a.Conversion_Date 
+1

Je n'aurais jamais pensé à faire une auto-jointure ... génie. Merci! –

+0

Pas de soucis @NickKnauer heureux de vous aider – scsimon

+0

Cela fonctionnera-t-il encore si la colonne de la date de conversion est sous la forme d'un horodatage tel que '2017-07-15 01:34:29'? @scsimon –