【问题标题】:Sum Non Null Values Block in SQLSQL 中的 Sum 非 Null 值块
【发布时间】:2022-01-20 23:24:30
【问题描述】:

如何在没有任何分组条件的情况下逐块添加非 Null 值:

示例输入:

Machine  Value    DateTime
a        null     1 Dec 2021 8:34AM
a        2        1 Dec 2021 8:35AM
a        1        1 Dec 2021 9:34AM
a        3        1 Dec 2021 10:11AM
a        null     1 Dec 2021 11:14AM
a        null     1 Dec 2021 11:16AM
a        5        1 Dec 2021 11:58AM
a        6        1 Dec 2021 11:59AM

示例输出:

Machine  Value    DateTime              SumValue
a        null     1 Dec 2021 8:34AM     
a        2        1 Dec 2021 8:35AM
a        1        1 Dec 2021 9:34AM
a        3        1 Dec 2021 10:11AM     6
a        null     1 Dec 2021 11:14AM
a        null     1 Dec 2021 11:16AM
a        5        1 Dec 2021 11:58AM
a        6        1 Dec 2021 11:59AM     11

我没有除设备列之外的任何其他分组条件,但我希望按块求和

【问题讨论】:

  • 行的顺序是什么?
  • 在 SQL 中,表和数据集被明确认为是无序的。只有添加另一个可以派生订单的列(例如在 ORDER BY 中),才能解决此问题。
  • 是的,我已经添加了日期时间列,请检查并帮助

标签: sql sql-server


【解决方案1】:

您需要定义组并使用窗口化SUM()

表:

SELECT *
INTO Data
FROM (VALUES
   ('2021-12-12T09:00:01', 'a', null),
   ('2021-12-12T09:00:02', 'a', 2),
   ('2021-12-12T09:00:03', 'a', 1),
   ('2021-12-12T09:00:04', 'a', 3),
   ('2021-12-12T09:00:05', 'a', null),
   ('2021-12-12T09:00:06', 'a', null),
   ('2021-12-12T09:00:07', 'a', 5),
   ('2021-12-12T09:00:08', 'a', 6)
) v (Date, Machine, Value)

声明:

SELECT 
   Date, Machine, Value, 
   CASE 
      WHEN ROW_NUMBER() OVER (PARTITION BY Machine, GroupNumber ORDER BY Date DESC) = 1 
      THEN SUM(Value) OVER (PARTITION BY Machine, GroupNumber ORDER BY (SELECT NULL))
   END AS SumValue
FROM (
   SELECT
      *,
      SUM(CASE WHEN Value IS NULL THEN 1 ELSE 0 END) OVER (PARTITION BY Machine ORDER BY Date) AS GroupNumber
   FROM Data
) t
ORDER BY Machine, Date

结果:

Date                Machine Value SumValue
2021-12-12T09:00:01 a       
2021-12-12T09:00:02 a       2   
2021-12-12T09:00:03 a       1   
2021-12-12T09:00:04 a       3     6
2021-12-12T09:00:05 a       
2021-12-12T09:00:06 a       
2021-12-12T09:00:07 a       5   
2021-12-12T09:00:08 a       6     11

【讨论】:

    猜你喜欢
    • 2015-10-05
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多