T-SQL反求与递归
我相信一定有一个简洁的解决方案,但我似乎无法得到任何我需要的工作方式。我相信你应该能够实现这一点使用递归CTE。我试图避免创建大量的Tmp表 主表(或递归锚?)按人、月和年聚合数据,并对结果应用计数和排序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
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
请张贴一个表格的例子,你需要从中提取这些信息。