T-SQL递归以查找一段时间内的事务

T-SQL递归以查找一段时间内的事务,sql,sql-server,tsql,select,recursion,Sql,Sql Server,Tsql,Select,Recursion,我已经试过了,但我没能弄明白这一点。我有一个表transactions,transaction,Person,transaction,Date等等。 我想要的是返回去年每周有3次以上交易的所有交易\个人\ ID。这意味着我必须检查1-1-10到7-1-10,看看是否有人在这7天内有超过3笔交易,然后检查2-1-10到8-1-10,然后检查3-1-10到9-1-10等等。 我现在需要使用递归选择,但我所写的并没有产生正确的时间框架。 到目前为止,我写的是 WITH Dates AS (

我已经试过了,但我没能弄明白这一点。我有一个表transactions,transaction,Person,transaction,Date等等。 我想要的是返回去年每周有3次以上交易的所有交易\个人\ ID。这意味着我必须检查1-1-10到7-1-10,看看是否有人在这7天内有超过3笔交易,然后检查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)
然后

。 . . . . 直到它消失

 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个查询的结果,这将给出一个包含个人和周的结果集,而不是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或weeks派生表中的每行游标

您想要360个不同的结果集?您的答案是100%正确。只是group by就像这个group by t.transaction\u person\u Id,w.WeekStartMidnight,w.WeekEndMidnight,非常感谢
 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
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)