2017-02-07 2 views
2

Ich poste eine Beispieldaten unten.Rang über Row_Number in SQL

enter image description here

Was ich habe, ist eine Zeilennummer, die eine Zahl erzeugt, basierend auf Datum und Namen Spalten (ROW_NUMBER Funktion erreicht verwenden). Was ich jetzt brauche, ist eine andere abgeleitete Spalte namens Group_Num, die für jede Gruppe eine Nummer erstellt (in diesem Fall 3). Kann dies erreicht werden, wenn man bedenkt, dass sich die Spalte Name wiederholt, aber der Wert der Spalte Datum ändert?

Vielen Dank im Voraus.

+3

Bitte das Bild entfernen und Beispieldaten als DDL + DML hinzufügen und zeigen auch die Abfrage, die Sie derzeit haben. –

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557#285557 –

Antwort

3

Überprüfen Sie dies. Wir können dies mit Row_number(), lag() und SUM() erreichen.

 select 
     Date, 
     Name, 
     Row_number()over(partition by Group_Num order by ROwiD) Row_Num, 
     Group_Num 
     from 
     (
      SELECT * , 
      SUM(R) OVER(ORDER BY RowID) Group_Num 
      FROM 
      (
       select *, 
       Case When 
       lag(name) OVER (ORDER BY RowID) = name 
       then 0 else 1 end as R 
       from 
        (
         select DATE,NAME, 
         row_number() OVER ( ORDER BY (select 1)) AS 'RowID' 
         from #TableName 
        )A 
      )B 
     )C 
     order by ROwiD 

OutPut:

enter image description here

+0

Danke für Ihre Antworten. Aber wenn ich das verwende, wird die Group_Num für die letzten 3 Zeilen als "1" zurückgegeben. Ich brauche es als 3 (obwohl der Name gleich ist). –

2

können Sie DENSE_RANK verwenden:

SELECT Date 
    , Name 
    , ROW_NUMBER() OVER(Partition By Name Order By Name, Date) as Row_Num 
    , DENSE_RANK() Over(order by Name) as Group_Num 
FROM #Table 
+0

Danke für Ihre Antwort. Aber wenn ich das verwende, wird die Group_Num für die letzten 3 Zeilen als "1" zurückgegeben. Ich brauche es als 3 (obwohl der Name gleich ist). –