【问题标题】:T-SQL Agregation and RecursionT-SQL 聚合和递归
【发布时间】:2014-04-18 09:39:14
【问题描述】:

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

主表(或递归 Anchor?)按 Person 、 Month 和 Year 聚合数据,并对结果应用计数和排名

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) as DPY_Cnt by PersonID & Mth WHERE YrRnk >= Anchor 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

【问题讨论】:

  • 请发布您需要从中提取此信息的表的示例。

标签: sql sql-server tsql recursion common-table-expression


【解决方案1】:

如果我对结果的理解正确,您需要DLY_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;

【讨论】:

    【解决方案2】:

    试试这个...

      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
    

    【讨论】:

      猜你喜欢
      • 2014-04-09
      • 2011-11-09
      • 2016-02-24
      • 2014-08-30
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多