2010-12-09 35 views
1

J'ai essayé mais je ne suis pas en mesure de comprendre cela. J'ai une table transactions (transaction_ID, transaction_Person_ID, Transaction_Date etc). Ce que je veux, c'est renvoyer tous les ID de transaction_person_id qui ont plus de 3 transactions par semaine pour la dernière année. Cela signifie que je dois vérifier 1-1-10 à 7-1-10 pour voir si quelqu'un a eu plus de 3 transactions pour cette période de 7 jours, puis pour 2-1-10 à 8-1-10 puis 3-1 -10 à 9-1-10 etc etc Maintenant, j'ai besoin d'utiliser une sélection récursive, mais ce que j'ai écrit ne produit pas le bon laps de temps. Ce que je l'ai écrit à ce jour est ceT-SQL récursif afin de trouver des transactions pour une période de temps

WITH Dates AS (
     SELECT 
     [Date] = CONVERT(DATETIME,'01/01/2010') 
     UNION ALL SELECT 
     [Date] = DATEADD(DAY, 1, [Date]) 
     FROM 
     Dates 
     WHERE 
     Date < '12/31/2010' 
) 

SELECT transaction_person_Id FROM transactions 
JOIN DATES 
ON transactions.transaction_date = dates.date 
where transactions.Transaction_Date between dateadd(DAYOFYEAR,-7,dates.date) and dates.date 
group by transaction_person_Id 
having count(transaction_person_ID) >= 4 
OPTION (MAXRECURSION 2000) 

Merci beaucoup

PS: en mots simples ce que je dois faire est ce

select transaction_person_ID from transactions 
    where Transaction_Date between '2010-01-01' and '2010-01-07' 
    group by transaction_person_Id 
    having count(transaction_person_ID) >= 4 

puis

select transaction_person_ID from transactions 
    where Transaction_Date between '2010-01-02' and '2010-01-08' 
    group by transaction_person_Id 
    having count(transaction_person_ID) >= 4 

. . . . . jusqu'à ce qu'il se

select transaction_person_ID from transactions 
    where Transaction_Date between '2010-12-25' and '2010-12-31' 
    group by transaction_person_Id 
    having count(transaction_person_ID) >= 4 

je dois avoir les résultats de ces 365 requêtes

+0

YOu veux 360 jeux de résultats différents? – gbn

Répondre

0

Cela donnera un jeu de résultats avec personne et semaines, plutôt que 360 ​​ensembles de résultats

WITH Weeks 
    AS (
     SELECT 
      CONVERT(DATETIME,'01 Jan 2010') AS WeekStartMidnight, 
      CONVERT(DATETIME,'08 Jan 2010') AS WeekEndMidnight 
     UNION ALL 
     SELECT 
      DATEADD(day, 1, WeekStartMidnight), 
      DATEADD(day, 1, WeekEndMidnight) 
     FROM 
      Weeks 
     WHERE 
      WeekEndMidnight < '31 Dec 2010' 
) 
SELECT 
    t.transaction_person_Id, 
    w.WeekStartMidnight, w.WeekEndMidnight 
FROM 
    weeks w 
    JOIN 
    transactions t ON t.Transaction_Date >= w.WeekStartMidnight AND t.Transaction_Date < w.WeekEndMidnight 
GROUP BY 
    t.transaction_person_Id 
HAVING 
    count(*) >= 4 --COUNT(t.transaction_person_Id) = same 
OPTION 
    (MAXRECURSION 365) 

Si vous voulez 360 jeux de résultats, c'est une boucle utilisant WHILE ou un CURSOR par ligne dans la table dérivée "weeks"

+0

Votre réponse est 100% exacte. Juste le groupe par est comme ça GROUPE PAR t.transaction_person_Id, w.WeekStartMidnight, w.WeekEndMidnight Merci beaucoup –