T-SQL反求与递归

T-SQL反求与递归,sql,sql-server,tsql,recursion,common-table-expression,Sql,Sql Server,Tsql,Recursion,Common Table Expression,我相信一定有一个简洁的解决方案,但我似乎无法得到任何我需要的工作方式。我相信你应该能够实现这一点使用递归CTE。我试图避免创建大量的Tmp表 主表(或递归锚?)按人、月和年聚合数据,并对结果应用计数和排序 SELECT PersonID , Mth , Yr , COUNT(*) as DLY_Cnt , RANK () OVER (PARTITION BY PersonID, Mth ORDER BY Yr DESC) as YrRnk FROM #BkgSummary GROUP B

我相信一定有一个简洁的解决方案,但我似乎无法得到任何我需要的工作方式。我相信你应该能够实现这一点使用递归CTE。我试图避免创建大量的Tmp表

主表(或递归锚?)按人、月和年聚合数据,并对结果应用计数和排序

SELECT  
  PersonID
, Mth
, Yr
, COUNT(*) as DLY_Cnt
, RANK () OVER (PARTITION BY PersonID, Mth ORDER BY Yr DESC) as YrRnk
FROM #BkgSummary
GROUP BY PersonID, Mth, Yr
示例结果

PersonID    Mth     Yr  DLY_Cnt    Dep_YrRnk
6000995     6      2010    2           1
6000995     6      2009    1           2
6000995     6      2007    1           3
6000995     8      2011    2           1
我需要进一步汇总结果(并将其添加到以前的结果集中),以便基本上计算出往年同一个月内PersonID和Mth上的预订数量(加上其自身价值)

例如:
SUM(DLY_Cnt)作为DPY_Cnt由PersonID&Mth生成,其中YrRnk>=锚定YrRnk

我追求的结果示例:

PersonID    Mth     Yr  DLY_Cnt    Dep_YrRnk    DPY_Cnt
6000995     6      2010    2           1            4
6000995     6      2009    1           2            2
6000995     6      2007    1           3            1
6000995     8      2011    2           1            2

如果我对结果理解正确,您需要的是
DLY\u Cnt
的累积总和。在SQL Server 2012中,您可以很容易地做到这一点:

SELECT PersonID, Mth, Yr, COUNT(*) as DLY_Cnt,
       RANK() OVER (PARTITION BY PersonID, Mth ORDER BY Yr DESC) as YrRnk,
       SUM(COUNT(*)) (PARTITION BY PersonId, Mth ORDER BY Yr) as DPY_Cnt
FROM #BkgSummary
GROUP BY PersonID, Mth, Yr;
您可以在早期版本中使用相关子查询执行类似操作:

with t as (
      SELECT PersonID, Mth, Yr, COUNT(*) as DLY_Cnt,
             RANK() OVER (PARTITION BY PersonID, Mth ORDER BY Yr DESC) as YrRnk
      FROM #BkgSummary
      GROUP BY PersonID, Mth, Yr
     )
select t.*,
       (select sum(DLY_CNT)
        from t t2
        where t.PersonID = t2.PersonId and
              t.Yr = t2.Yr and
              t.Mth >= t2.Mth
       ) as DPY_Cnt
from t;
试试这个

  WITH CTE
AS (
    SELECT ID
        , MTH
        , YR
        , COUNT(*) AS DLY_CNT
        , DENSE_RANK() OVER (ORDER BY ID, MTH) DR
    FROM A
    GROUP BY ID
        , MTH
        , YR
    )
SELECT ID
    , MTH
    , DR
    , SUM(DLY_CNT)
FROM CTE
GROUP BY ID
    , MTH
    , DR

请张贴一个表格的例子,你需要从中提取这些信息。