Czasami wykonując zapytania T-SQL potrzebujemy ponumerować wiersze. Baza SQL Server dostarcza nam kilka różnych funkcji.
Podstawową funkcją jest ROW_NUMBER, która zwraca dla danego zbioru wartości od 1 do n. W przypadku gdy dwa zwrócone wiersze zawierają identyczne dane, ROW_NUMBER traktuje je jako różne i nadaje im kolejne numery. Przykład:
select ROW_NUMBER() over(order BY NAME),ProductSubcategoryID from Production.Product;
W klauzuli over określa się m.in. sortowanie. Za pomocą tego ROW_NUMBER wie, jaka wartość jest tak naprawdę pierwsza w zbiorze.
Można również rozbić zbiór na kilka podzbiorów za pomocą PATRITION BY:
select ROW_NUMBER() over(PARTITION BY ProductSubcategoryID order BY NAME ),ProductSubcategoryID from Production.Product;
W tej chwili wiersze o różnych ProductSubcategoryID będą numerowane osobno. Wynik będzie zatem wyglądać mniej więcej tak:
ROW_NUMBER | ProductSubcategoryID |
1 | 1 |
2 | 1 |
3 | 1 |
4 | 1 |
1 | 2 |
2 | 2 |
3 | 2 |
1 | 5 |
2 | 5 |
3 | 5 |
W następnym poście zajmiemy się funkcją RANK.
Dzięki serdeczne, właśnie tego szukałam 🙂
Witam! Tego szukałem!
Potrzebuję jeszcze tak “pogrupowane” rekordy podzielić na “paczki” po 99 sztuk … da się?
już zrobiłem – ROW_NUMBER() OVER(PARTITION BY Magazyn order BY magazyn, indeks)/100+1 as PACZKA