web-dev-qa-db-ja.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パーティション。私が実際に必要なのは、それぞれのts_DateTimeパーティション化して、RowFilter列はRequired result列のように見えるはずです。

46
DLR

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
82
John Woo

あなたはこれを探していると思います:

ROW_NUMBER() OVER (PARTITION BY hl.id ORDER BY hl.ts_DateTime) AS RowFilter
4
Michał Turczyn