Zastanawialiście się kiedyś jak robić stronicowanie w SQL Server? Ja ostatnio musiałem coś takiego zrobić, ale nie używając żadnego ORM'a lecz jedynie gołe ADO.NET. Sprawa wydawała się być banalna, napisałem zapytanie ale okazało się, że wyniki są jakieś dziwne i jeszcze się powielają mimo tego iż miałem DISTINCTA na zapytaniu. Poszperałem trochę w necie i doczytałem, że powinienem zamiast funkcji ROW_NUMBER() używać DENSE_RANK(). Okazuje się, że ROW_NUMBER() nadaje każdemu wierszowi kolejny, unikalny number. DENSE_RANK() nadaje unikalny numer ale jedynie wierszom, które się nie duplikują.
Na tej stronie możecie znaleźć fajnie to wszystko wyjaśnione. Również różnicę między DENSE_RANK() a RANK().
W skrócie:
Z tej powyższej strony wzięta jest również poniższa tabelka, która na szybko przedstawia różnicę między ROW_NUMBER(), RANK() oraz DENSE_RANK()
W skrócie:
- ROW_NUMBER - nadaje każdemu wierszowi unikalny numer, nie zważając na duplikaty
- RANK() - nadaje unikalnym wierszom rangę (unikalny numer) z przerwami w rankingu
- DENSE_RANK() - nadaje unikalnym wierszom rangę (unikalny number) bez przerw w rankingu.
Z tej powyższej strony wzięta jest również poniższa tabelka, która na szybko przedstawia różnicę między ROW_NUMBER(), RANK() oraz DENSE_RANK()
+---+------------+------+------------+ | V | ROW_NUMBER | RANK | DENSE_RANK | +---+------------+------+------------+ | a | 1 | 1 | 1 | | a | 2 | 1 | 1 | | a | 3 | 1 | 1 | | b | 4 | 4 | 2 | | c | 5 | 5 | 3 | | c | 6 | 5 | 3 | | d | 7 | 7 | 4 | | e | 8 | 8 | 5 | +---+------------+------+------------+