web-dev-qa-db-fra.com

Comment renvoyer un numéro de groupe incrémentiel par groupe dans SQL

Je voudrais créer une requête de données en SQL pour numéroter de manière incrémentielle des groupes de lignes, groupées sur une date/heure commune et garder les "numéros de groupe" incrémentés sur la prochaine date et ainsi de suite. Ces "numéros de groupe" ne doivent pas être réinitialisés pour chaque groupe comme je l'ai vu lors de l'utilisation de la partition par instruction. Voici mes exemples de données:

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


La requête que j'utilise pour obtenir ces résultats est:

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

Donc, en gros, en regardant la colonne RowFilter, j'obtiens un numéro de ligne unique par ts_DateTime cloison. Ce dont j'ai réellement besoin, c'est que pour chaque ts_DateTime partitionne la colonne RowFilter devrait ressembler à la colonne de résultat requise.

46
DLR

vous ne devriez pas utiliser ROW_NUMBER(),

  • utilisez DENSE_RANK() à la place
  • retirer PARTITION BY

question,

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

Je pense que vous cherchez ceci:

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