SQL查询以查找基于日期的数据的本地最大值、最小值
我有以下数据集SQL查询以查找基于日期的数据的本地最大值、最小值,sql,sql-server,sql-server-2008,tsql,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
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)
其思想是根据日期对所有行进行排序,并根据日期对每个类别中的所有行进行排序。如果这些数字之间的差异发生变化,则表示一个类别的连续事件链被另一个类别打破。您使用的是什么dbms?只有两个类别,但有三个结果。你是说每个连续(按日期)类别一次吗?没错,我在我的问题中添加了一个注释+1一些额外的解释:
行数()之间的差异
在下一行从A切换到B时增加。当两行具有相同的类别时,差异保持不变。@Lennart我从10mn开始阅读查询,直到您添加此解释,我才理解。那太聪明了!Lennart,非常感谢您的快速响应,代码返回了我想要的确切结果。非常感谢你!Lennart,我想给每个组(类别)分配一些ID,但不知道如何分配。这是通过代码中的grp列实现的。才华横溢:-)!