我尝试创建一个复杂的 SQL-Insert,但不确定在标题中找到正确的流行语。
好的,这里有一些数据来解释我的问题:
Date Type
20160321 entry
20160322 entry
20160324 entry
20160325 delete
20160424 entry
20160425 entry
20160428 update
20160504 update
20160520 update
20160520 entry
现在我想按日期顺序按“类型”的每次更改来创建组...以便最终存在下表:
Date Type Group
20160321 entry 1
20160322 entry 1
20160324 entry 1
20160325 delete 2
20160424 entry 3
20160425 entry 3
20160428 update 4
20160504 update 4
20160520 update 4
20160520 entry 5
我尝试了很多东西...使用 LEAD、LAG、FIRST_VALUE 以及后来使用 row_number 进行的更新...但是这个解决方案没有任何效果... 我的问题是组不能由数据本身定义...组是根据之前的顺序和值组合出现的...
希望您理解我的问题并能够帮助我!
最佳答案
您可以使用以下查询:
SELECT [Date], [Type],
DENSE_RANK() OVER (ORDER BY min_Date) AS [Group]
FROM(
SELECT [Date], [Type],
MIN([Date]) OVER (PARTITION BY [Type], grp) AS min_Date
FROM (
SELECT [Date], [Type],
ROW_NUMBER() OVER (ORDER BY [Date]) -
ROW_NUMBER() OVER (PARTITION BY [Type] ORDER BY [Date]) AS grp
FROM mytable) AS t) AS s
ORDER BY [Date]
说明:
最里面的查询:
SELECT [Date], [Type],
ROW_NUMBER() OVER (ORDER BY [Date]) -
ROW_NUMBER() OVER (PARTITION BY [Type] ORDER BY [Date]) AS grp
FROM mytable
检测共享相同Type
值的连续记录的岛:
Date Type grp
========================
20160321 entry 0
20160322 entry 0
20160324 entry 0
20160325 delete 3
20160424 entry 1
20160425 entry 1
20160428 update 6
20160504 update 6
20160520 update 6
20160520 entry 4
第二级查询使用 MIN() OVER() 来计算每个 Type
切片的最小 Date
值:
Date Type min_Date
============================
20160321 entry 20160321
20160322 entry 20160321
20160324 entry 20160321
20160325 delete 20160325
20160424 entry 20160424
20160425 entry 20160424
20160428 update 20160428
20160504 update 20160428
20160520 update 20160428
20160520 entry 20160520
现在可以通过在 min_Date
字段上应用 DENSE_RANK
轻松计算 Group
值。
关于sql-server - 插入复杂有序组计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36201704/