sql-server - 如何对由任意表达式描述的日期排序事件进行分组/窗口?

标签 sql-server sql-server-2014 window-functions

我想根据日期和一些(可能是任意的)指标将一些数据分组在一起:

Date       | Ind
================
2016-01-02 | 1
2016-01-03 | 5
2016-03-02 | 10
2016-03-05 | 15
2016-05-10 | 6
2016-05-11 | 2

我想将后续(按日期排序)行分组在一起,但在 Indicator >= 10 之后打破分组:

Date       | Ind | Group
========================
2016-01-02 | 1   |   1
2016-01-03 | 5   |   1
2016-03-02 | 10  |   1

2016-03-05 | 15  |   2

2016-05-10 | 6   |   3
2016-05-11 | 2   |   3

我确实在博客文章的末尾找到了一种很有前途的技术:“Use this Neat Window Function Trick to Calculate Time Differences in a Time Series”(最后一小节“额外奖励”),但查询的重要部分使用了关键字(FILTER),SQL Server 似乎不支持(稍后快速 Google 一下,我不确定哪里支持它!)。

我仍然希望使用窗口函数的技术可能是答案。我只需要一个可以添加到每一行的计数器(如 RANKROW_NUMBER 所做的那样),但仅当某些任意条件评估为 true.有没有办法在 SQL Server 中做到这一点?

最佳答案

解决方案如下:

DECLARE @t TABLE ([Date] DATETIME, Ind INT)

INSERT INTO @t 
VALUES
('2016-01-02', 1),
('2016-01-03', 5),
('2016-03-02', 10),
('2016-03-05', 15),
('2016-05-10', 6),
('2016-05-11', 2)

SELECT [Date],
       Ind,
       1 + SUM([Group]) OVER(ORDER BY [Date]) AS [Group]
FROM 
(
    SELECT  *, 
            CASE WHEN LAG(ind) OVER(ORDER BY [Date]) >= 10 
                THEN 1 
                ELSE 0 
            END AS [Group] 
      FROM @t
) t

当 previous 大于 10 时,只需将行标记为 1,否则 0。然后运行总和将为您提供所需的结果。

关于sql-server - 如何对由任意表达式描述的日期排序事件进行分组/窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37145568/

相关文章:

SQL Server 更新后触发器

sql - 我可以在 SQL 中执行 max(count(*)) 吗?

sql - sql中的sumProduct

sql - 在 Pivot SQL 查询中为字段名称添加别名

sql-server - SQL Server 如何决定隐式日期时间转换的格式?

sql-server - 在 SQL Server 2014 中使用聚集列存储索引时,具有大量列的表仍然是反模式吗?

mysql - 索引不影响 ms sql 2014 VS mysql (mariaDB 10) 中的时间执行

sql - oracle SQL选择过去x天滚动期间的不同客户

sql - 不能排除以前的非重复行

c# - 如何使用 Join 搜索字段?