2016-10-17 5 views
2

Ich versuche, einige Ergebnisse in einer Tabelle nach ihrer ID und ihrem Namen zu gruppieren. Für die Gruppe möchte ich auch die next_id, den Leitwert des nächsten Datensatzes, der Teil der Gruppe ist, auswählen. Wenn ich eine Abfrage wie folgt ausgeben:Korrekte Gruppierung sql

SELECT id, grade, name, 
    LEAD(id) OVER (ORDER BY name ASC, id ASC) as next_id 
    FROM dbo.GRADES 
    where name like '%alan%' 
    order by name ASC, id asc; 

bekomme ich dieses Ergebnis, das, was erwarte ich, ist

28273 100 alan-jones 28274 
28274 100 alan-jones 28275 
28275 100 alan-jones 28276 
28276 200 alan-jones 28280 
28280 100 alan-jones 28281 
28281 100 alan-jones 28282 
28282 100 alan-jones NULL 

NULL gibt an, dass die obigen Ergebnisse keinen nächsten Datensatz zu zeigen haben.

Allerdings, wenn ich diese Abfrage ausführen auf mehr Menschen als alan, dh ohne die where-Klausel:

SELECT id, grade, name, 
    LEAD(id) OVER (ORDER BY name ASC, id ASC) as next_id 
    FROM dbo.GRADES 
    order by name ASC, id asc; 

ich die folgenden Ergebnisse zu erhalten, dass ich es tat nichterwarten

28277 100 mike-cools 28278 
28278 100 mike-cools 28283 
28283 200 mike-cools 28284 
28284 200 mike-cools 28279 
28279 200 mike-cools 28273 
28273 100 alan-jones 28274 
28274 100 alan-jones 28275 
28275 100 alan-jones 28276 
28276 200 alan-jones 28280 
28280 100 alan-jones 28281 
28281 100 alan-jones 28282 
28282 100 alan-jones NULL 

Die Zeile, die das Problem für mich verursacht, ist:

28279 200 mike-cools 28273 
28273 100 alan-jones 28274 

sollte diese Zeile lesen:

28279 200 mike-cools NULL 
28273 100 alan-jones 28274 

ich nicht herausfinden kann, wie ich richtig meine Abfrage Gruppe ändern kann, und nicht auf die next_id zeigen, wenn die Gruppe nicht das gleiche ist.

Antwort

4

Sie müssen Partition Ihren lead Anruf mit Namen, nicht um durch

SELECT id, grade, name, 
     LEAD(id) OVER (PARTITION BY name ORDER BY id ASC) as next_id 
     -- Here -------^ 
FROM  dbo.GRADES 
ORDER BY name ASC, id asc; 
+0

ah, das war es – angryip

+0

wenn ich in der Hauptfunktion einen Auftrag tun, würde nicht ich möchte die gleiche Reihenfolge in der letzten Anweisung der Hauptfunktion? – angryip

+2

@anryip: Sie * können * PARTITION BY name ORDER BY name ASC, id ASC verwenden, aber da es nur einen Namen pro Partition gibt, ist es überflüssig. –