给出下表,包含数百万条日志条目。每个日志条目可以是kind = 0(清除)或kind = 1(事件)。清除意味着所有先前事件都得到处理 - 因此可以对它们进行分组(在视图中)。所有后续事件必须按其状态和发生的最新日期进行分组。
WHILE或临时表实际上是一个具有此表大小的解决方案。我调查了sql group by only rows which are in sequence,但无法找到一种方法使其适应给定的问题。
编辑1:重新排列的行以突出显示清除
给定数据表(按RelationId排序,ValidFrom DESC )
Id|RelationId|Kind|StatusId| ValidFrom
--------------------------------------
10| 1| 1| 14|2015-01-06
9 | 1| 1| 14|2015-01-05
8 | 1| 1| 15|2015-01-05
7 | 1| 0| 12|2015-01-04 (clearing id 6,4)
6 | 1| 1| 13|2015-01-03 (.. cleared with id 7)
4 | 1| 1| 13|2015-01-02 (.. cleared with id 7)
3 | 2| 1| 19|2015-01-02
1 | 2| 0| 18|2015-01-01 (no clearing)
5 | 3| 0| 18|2015-01-03 (clearing id 2)
2 | 3| 1| 20|2015-01-02 (.. cleared with id 5)
--------------------------------------
下表列出了令人失望的输出。如您所见,事件计数不会考虑清算行。
编辑2:添加了要清除的问题
问题:什么是高效的SQL查询,输出以下结果?
RelationId|StatusId|Count|MaxValidFrom
--------------------------------------
1 | 14| 2| 2015-01-06
1 | 15| 1| 2015-01-05
1 | 12| 2| 2015-01-04
2 | 19| 1| 2015-01-02
3 | 18| 1| 2015-01-03
--------------------------------------
使用的SQL Server是SQL 2008 R2 Enterprise。
感谢您的帮助!