如何在SQL中为每个组返回一个增量组号

76

我想在SQL中创建一个数据查询,对具有相同日期时间的行组进行递增编号,并保持“组号”在下一个日期时间上递增,以此类推。当使用partition by语句时,这些“组号”不得为每个组重置。以下是我的示例数据:

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
所以基本上,查看ts_DateTime分区的RowFilter列,我会得到唯一的ROW编号。我实际需要的是,对于每个ts_DateTime分区,RowFilter列应该像所需结果列一样。

1
什么类型的SQL?这种事情取决于数据库。 - user1919238
我曾经遇到过同样的问题,但就是找不到解决方法。关键在于将第一个窗口函数的 PARTITION BY 子句作为第二个窗口函数(未分区)的 ORDER BY 子句。 - sayap
4
我觉得很有讽刺意味的是,你所谓的“错误结果”实际上是我需要的。 :) 谢谢你发布代码。 - Gellie Ann
我也是 - 你的“错误结果”解决了我的问题 - 谢谢并点赞! - Mark G
3个回答

134

你不应该使用 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

1
我编辑了John Woo的答案。它没有正确列举RowFilter,请查看此链接http://sqlfiddle.com/#!18/1e62d/15 - user1080381

10

我想你在寻找这个:

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

1

-- Here Is my answer Mr.Chris Ballance :

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,
   DENSE_RANK() OVER (PARTITION BY hl.ts_datetime ORDER BY hl.Tagname) AS RequiredResult
from Table1 h1

--尝试这个,它对我起作用了...


你好,欢迎来到SO!如果您要发布类似于“代码”的内容,建议在编辑窗口中使用花括号符号。这将使您所建议的SQL语句更加清晰明了。 - mtholen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接