T-SQL рекурсивный для поиска транзакций за период времени - PullRequest
1 голос
/ 09 декабря 2010

Я пытался, но я не могу понять это. У меня есть таблица транзакций (транзакция_ID, транзакция_Person_ID, Transaction_Date и т. Д.). Что я хочу, чтобы вернуть все транзакции_person_ID, которые имеют более 3 транзакций в неделю за последний год. Это означает, что я должен проверить от 1-1-10 до 7-1-10, чтобы увидеть, было ли у кого-то больше 3 транзакций за этот 7-дневный период, затем от 2-1-10 до 8-1-10, затем 3-1 От -10 до 9-1-10 и т. Д. Теперь мне нужно использовать рекурсивный выбор, но то, что я написал, не дает правильные временные рамки. То, что я написал до сих пор, это

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)

Большое спасибо

PS: Проще говоря, что мне нужно сделать, это

 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

тогда

 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

. , , , , пока не пойдет

 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

мне нужны результаты этих 365 запросов

1 Ответ

0 голосов
/ 09 декабря 2010

Это даст один набор результатов с персоной и неделями, а не 360 наборов результатов

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)

Если вам нужно 360 наборов результатов, это цикл, использующий WHILE или CURSOR для строки в производной таблице «недель»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...