【问题标题】:T-SQL recursive in order to find transactions for a period of timeT-SQL 递归以便查找一段时间内的事务
【发布时间】:2011-05-22 17:27:37
【问题描述】:

我已经尝试过,但我无法解决这个问题。我有一个表交易(transaction_ID、transaction_Person_ID、Transaction_Date 等)。 我想要的是返回去年每周有超过 3 笔交易的所有 transaction_person_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)

非常感谢

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个查询的结果

【问题讨论】:

  • 您想要 360 个不同的结果集?

标签: sql sql-server tsql select recursion


【解决方案1】:

这将给出一个包含人员和周数的结果集,而不是 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 循环

【讨论】:

  • 您的答案是 100% 正确的。只是 group by 是这样的 GROUP BY t.transaction_person_Id, w.WeekStartMidnight, w.WeekEndMidnight 非常感谢
猜你喜欢
  • 2017-10-17
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
  • 2020-06-12
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多