【问题标题】:How to Sum (MAX values) from different value groups in same column SQL Server如何从同一列 SQL Server 中的不同值组求和(MAX 值)
【发布时间】:2021-11-08 15:16:26
【问题描述】:

我有一张这样的桌子:

Date Consec_Days
2015-01-01 1
2015-01-03 1
2015-01-06 1
2015-01-07 2
2015-01-09 1
2015-01-12 1
2015-01-13 2
2015-01-14 3
2015-01-17 1

我需要对 Consec_Days > 1 的每个连续分组的最大值(天)求和。所以正确的结果是 5 天。

【问题讨论】:

  • 只连续两天?如果 2015-01-15 有一行,结果会是什么?
  • 可以连续2天以上。因此,如果有 2015-01-15,结果将是 6 = 每个连续天组的最大连续天数之和

标签: sql-server sum max


【解决方案1】:

这是一种缝隙和岛屿问题。

解决方法很多,这里简单介绍一个

  • 使用LAG获取每个组的起点
  • 使用窗口条件计数计算分组 ID
  • 按该 ID 分组并取最高和
WITH StartPoints AS (
    SELECT *,
      IsStart = CASE WHEN LAG(Consec_Days) OVER (ORDER BY Date) = 1 THEN 1 END
    FROM YourTable t
),
Groupings AS (
    SELECT *,
      GroupId = COUNT(IsStart) OVER (ORDER BY Date)
    FROM StartPoints
    WHERE Consec_Days > 1
)
SELECT TOP (1)
  SUM(Consec_Days)
FROM Groupings
GROUP BY
  GroupId
ORDER BY
  SUM(Consec_Days) DESC;

db<>fiddle

【讨论】:

    【解决方案2】:
    with cte as (
    select  Consec_Days,
        coalesce(lead(Consec_Days) over (order by Date), 1) as next
    from    YourTable
    )
    select sum(Consec_Days)
    from cte
    where Consec_Days <> 1 and next = 1
    

    db<>fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-10
      • 2017-05-30
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多