t-sql 函数,如 sum(x) 过滤器(条件)的“过滤器”(按

Posted

技术标签:

【中文标题】t-sql 函数,如 sum(x) 过滤器(条件)的“过滤器”(按【英文标题】:t-sql function like "filter" for sum(x) filter(condition) over (partition by 【发布时间】:2019-03-26 05:55:59 【问题描述】:

我正在尝试对带有过滤器的窗口求和。我看到了类似的东西 sum(x) filter(condition) over (partition by...) 但它似乎在 t-sql, SQL Server 2017 中不起作用。

基本上,我想对另一列有条件的最后 5 行求和。

我试过了 sum(case when condition...) over (partition...)sum(cast(nullif(x))) over (partition...)

我尝试使用 where 条件左加入表格以过滤掉条件。

以上所有都将添加当前行起点的最后5个条件。

我想要的是当前行。添加上面满足条件的最后 5 个值。

Date| Value | Condition | Result
1-1   10      1          
1-2   11      1 
1-3   12      1
1-4   13      1
1-5   14      0
1-6   15      1
1-7   16      0
1-8   17      0      sum(15+13+12+11+10)
1-9   18      1      sum(18+15+13+12+11)
1-10  19      1      sum(19+18+15+13+12)

在上面的例子中,我想要的条件是 1,忽略 0,但“窗口”大小仍然是 5 个非 0 值。

【问题讨论】:

什么是日期列,是您给出的日期还是值? 日期列是一个日期。 【参考方案1】:

这可以使用相关子查询轻松实现:

首先,创建并填充示例表(在您以后的问题中保存我们这一步):

DECLARE @T AS TABLE
(
    [Date] Date, 
    [Value] int, 
    Condition bit
)
INSERT INTO @T ([Date], [Value], Condition) VALUES
('2019-01-01', 10, 1),
('2019-01-02', 11, 1),
('2019-01-03', 12, 1),
('2019-01-04', 13, 1),
('2019-01-05', 14, 0),
('2019-01-06', 15, 1),
('2019-01-07', 16, 0),
('2019-01-08', 17, 0),
('2019-01-09', 18, 1),
('2019-01-10', 19, 1)

查询:

SELECT [Date], [Value], Condition,
       (
           SELECT Sum([Value])
           FROM 
           (
               SELECT TOP 5 [Value] 
               FROM @T AS t1
               WHERE Condition = 1
               AND t1.[Date] <= t0.[Date]
-- If you want the sum to appear starting from a specific date, unremark the next row
               --AND t0.[Date] >  '2019-01-07'
               ORDER BY [Date] DESC                 
           ) As t2
           HAVING COUNT(*) = 5 -- there are at least 5 rows meeting the condition
       ) As Result
FROM @T As T0

结果:

Date        Value   Condition   Result
2019-01-01  10      1           
2019-01-02  11      1           
2019-01-03  12      1           
2019-01-04  13      1           
2019-01-05  14      0           
2019-01-06  15      1           61
2019-01-07  16      0           61
2019-01-08  17      0           61
2019-01-09  18      1           69
2019-01-10  19      1           77

【讨论】:

以上是关于t-sql 函数,如 sum(x) 过滤器(条件)的“过滤器”(按的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL 中的加权平均值(如 Excel 的 SUMPRODUCT)

我们可以使用不同的过滤条件在同一个表字段或列上多次使用相同的聚合函数吗?

T-SQL 在一组条件中恰好有一个条件为真

SQL SUM 直到条件

PySpark 中的窗口函数和条件过滤器

T-SQL 根据与其他记录的日期和时间差过滤记录