SQL 查询查找基于日期的数据的本地最大值、最小值

标签 sql sql-server sql-server-2008 t-sql

我有以下数据集

Date         Category  
2014-01-01     A  
2014-01-02     A  
2014-01-03     A  
2014-01-04     B  
2014-01-05     B  
...  
2014-01-10     B  
2014-01-11     A  
...  
2014-01-20     A  

我想要实现的结果是找到A和B的本地最小/最大日期,如下:

MinDate       MaxDate       Category  
2014-01-01    2014-01-03       A  
2014-01-04    2014-01-10       B  
2014-01-11    2014-01-20       A  

注意:使用

Select min(date), max(date), category from TABLE Group by category  

将创建结果

MinDate MaxDate Category  
2014-01-01 2014-01-20 A  
2014-01-04 2014-01-10 B  

这不是我想要实现的目标

最佳答案

假设您有一个支持窗口函数的 DBMS,您可以执行以下操作:

select category, grp, min(date) as min_date, max(date) as max_date
from (
    select category, date
         , row_number() over (order by date) 
         - row_number() over (partition by category order by date) as grp
    from T
) as X
group by category, grp
order by min(date)

这个想法是根据日期对所有行进行排序,并根据日期对每个类别中的所有行进行排序。如果这些数字之间的差异发生变化,则意味着一个类别的连续事件链被另一个类别打破。

关于SQL 查询查找基于日期的数据的本地最大值、最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25543993/

相关文章:

sql-server - 查看服务器状态并查看 SQL 托管实例中的所有定义

sql-server - 当前在存储过程中运行查询

SQL : Select a table name containing specific string

c# - Windows 操作系统之间的 SQL 连接字符串是否不同?

sql - 返回对应值变化的账户的所有历史账户记录

MySQL 选择开启和关闭时间戳之间的最大值加上 3 秒

mysql - 是否可以优化这个MySql查询

c# - 在 Windows 窗体或 WPF 应用程序中使用集成服务项目?

c# - C# 程序中 SQL Server 的 OleDB 连接字符串

c# - 将关系(规范化)数据表快速插入 SQL Server 2008 数据库