SQL查询以查找基于日期的数据的最大,最小值

时间:2014-08-28 08:16:24

标签: sql sql-server sql-server-2008 tsql

我有以下数据集

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  

这不是我想要实现的目标

1 个答案:

答案 0 :(得分:5)

假设您有一个支持窗口功能的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)

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