sql-server - 插入复杂有序组计数器

标签 sql-server sql-insert

我尝试创建一个复杂的 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/

相关文章:

sql - 触发器以确保总和小于不同表中的值

mysql存储过程不写入预期数据

sql - 同一INSERT时另一列中序列列的引用值

sql - 如果前一个值为空,如何获取倒数第二个值

sql-server - 如何使直通/直通查询可编辑?

sql-server - 应从哪里加载 Microsoft.SqlServer.Management.IntegrationServices.dll?

MySQL INSERT 语句插入两个表,使用另一个表中的 AI 值

mysql - 插入不会复制数据 "Duplicate entry ' 0' for key ' PRIMARY'"

sql - 在不使用唯一列或键列的情况下定义两个 SQL Server 表(父列到子列)之间的关系

c# - 如何将图像存储到 varbinary(max) 列?