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. Lesen
Lesen. 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

Schreibe einen Kommentar