SQL Server - Verhalten der ROW_NUMBER-Partition, die durch Null-Wert
Ich finde dieses Verhalten sehr merkwürdig und widersprüchlich. (Auch für SQL).
set ansi_nulls off
go
;with sampledata(Value, CanBeNull) as
(
select 1, 1
union
select 2, 2
union
select 3, null
union
select 4, null
union
select 5, null
union
select 6, null
)
select ROW_NUMBER() over(partition by CanBeNull order by value) 'RowNumber',* from sampledata
Gibt
1 3 NULL
2 4 NULL
3 5 NULL
4 6 NULL
1 1 1
1 2 2
Was bedeutet, dass alle null-Werte behandelt werden, als Teil der gleichen Gruppe für die Zwecke der Berechnung der Zeilennummer. Es ist egal, ob das SET ANSI_NULLLS-oder ausgeschaltet ist.
Da aber per definition null ist völlig unbekannt, wie kann dann der null-Werte werden zusammen gruppiert, wie diese? Es ist zu sagen, dass für die Zwecke der Platzierung Dinge in eine Rang-Reihenfolge, die äpfel und Orangen und die Quadratwurzel von minus 1 und Quanten schwarze Löcher oder was auch immer werden kann, sinnvoll angeordnet. Ein wenig Experimentieren deutet darauf hin, dass die erste Spalte verwendet wird zum generieren der Rangfolge als
select 1, '1'
union
select 2, '2'
union
select 5, null
union
select 6, null
union
select 3, null
union
select 4, null
erzeugt die gleichen Werte. Dies hat erhebliche Auswirkungen, die die Probleme verursacht haben, in legacy-code, die ich bin den Umgang mit. Ist dies das erwartete Verhalten und gibt es eine Möglichkeit der Minderung, bei anderen als das ersetzen der null-Wert in die select-Abfrage mit einem eindeutigen Wert?
Den Ergebnissen, die ich erwartet hätte, wäre gewesen
1 3 NULL
1 4 NULL
1 5 NULL
1 6 NULL
1 1 1
1 2 2
Mit Dense_Rank() macht keinen Unterschied.
PARTITION BY
baut Gruppen, so ist es nicht konsistent? GROUP BY
macht das gleiche, die dokumentiert ist in der SQL:2003 standard. LesenLesen. Aber eine Gruppe nicht über eine inhärente Reihenfolge innerhalb der Gruppe - partition nicht zu schaffen, wie eine Bestellung und als solche ist grundlegend anders
InformationsquelleAutor SimonN | 2016-09-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Yo.
Also der deal ist, dass, wenn T-SQL ist der Umgang mit Null-Werten in Prädikaten verwendet es ternäre Logik (WAHR, FALSCH oder UNBEKANNT) und zeigt das Verhalten, das Sie angegeben haben, dass Sie erwarten, dass aus der Abfrage. Allerdings, wenn es um die Gruppierung der Werte, T-SQL behandelt Null-Werte als eine Gruppe. So wird die Abfrage der Gruppe der Null-Werte zusammen und beginnen die Nummerierung der Zeilen in diesem Fenster an.
Für die Ergebnisse, die Sie sagen, Sie würden gerne sehen, diese Abfrage sollte funktionieren...
InformationsquelleAutor