如何在SQL中返回每个组的增量组编号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在SQL中返回每个组的增量组编号相关的知识,希望对你有一定的参考价值。

我想在SQL中创建一个数据查询,以递增的行数组,在一个公共日期时间上分组,并在下一个日期时间保持“组号”递增,依此类推。正如我在使用分区语句时看到的那样,这些“组号”不能为每个组重置。这是我的示例数据:

ts_DateTime          |ID   |Value|RowFilter|RequiredResult
--------------------------
2013/01/09 09:23:16  |8009 |0    |1        |1
2013/01/09 09:23:16  |8010 |0    |2        |1
2013/01/09 09:23:16  |8026 |0    |3        |1

2013/01/09 09:23:22  |8026 |0    |1        |2

2013/01/09 09:23:28  |8009 |0    |1        |3
2013/01/09 09:23:28  |8010 |0    |2        |3
2013/01/09 09:23:28  |8026 |0    |3        |3

2013/01/09 09:27:03  |8009 |0    |1        |4
2013/01/09 09:27:03  |8010 |0    |2        |4
2013/01/09 09:27:03  |8026 |0    |3        |4

2013/01/09 09:27:09  |8009 |0    |1        |5
2013/01/09 09:27:09  |8010 |0    |2        |5
2013/01/09 09:27:09  |8026 |0    |3        |5

2013/01/09 09:27:15  |8009 |0    |1        |6
2013/01/09 09:27:15  |8010 |0    |2        |6
2013/01/09 09:27:15  |8026 |0    |3        |6


我用来获取这些结果的查询是:

select hl.ts_DateTime,  hl.Tagname as [ID],  hl.TagValue as [Value],
ROW_NUMBER() OVER (PARTITION BY hl.ts_datetime ORDER BY hl.tagname) AS RowFilter
from Table1 hl

所以基本上,看看RowFilter列,我得到每个ts_DateTime分区的唯一ROW编号。我真正需要的是,对于每个ts_DateTime分区,RowFilter列应该看起来像Required result列。

答案

你不应该使用ROW_NUMBER()

  • 改用DENSE_RANK()
  • 删除PARTITION BY

查询,

SELECT hl.ts_DateTime,  
       hl.Tagname as [ID],  
       hl.TagValue as [Value],
       DENSE_RANK() OVER (ORDER BY ts_datetime) AS RowFilter
FROM   Table1 hl 
ORDER  BY RowFilter
另一答案

我想你正在寻找这个:

ROW_NUMBER() OVER (PARTITION BY hl.id ORDER BY hl.ts_DateTime) AS RowFilter

以上是关于如何在SQL中返回每个组的增量组编号的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 查询中选择每个组的第一行?

t-SQL 查找每个组的前 10 条记录

如何在 hive sql 中获取每个组的最大 row_number()

如何编写查询以获取 SQL Server 中每个组的第一个条目? [复制]

每个组的本地最大值的 SQL 排序结果

当表很大时找到每个组的最大记录时如何优化sql?