Funkcja RANK w SQL Server jest rodzajem funkcji rankingowej. Ta funkcja będzie przypisz numer do każdego wiersza w obrębie podziału wyjścia . Przypisuje rangę do każdego wiersza jako jeden plus ranga poprzedniego wiersza. Gdy funkcja RANK znajdzie dwie identyczne wartości w tej samej partycji, przypisuje im ten sam numer rangi. Dodatkowo kolejną liczbą w rankingu będzie pozycja poprzednia plus zduplikowane liczby. Dlatego ta funkcja nie zawsze przypisuje ranking wierszy w kolejnej kolejności.
Funkcja RANK jest także częścią funkcji okna. Podczas korzystania z tej funkcji należy pamiętać o następujących kwestiach :
- Zawsze działa z klauzulą OVER().
- Przypisuje rangę każdemu wierszowi na podstawie klauzuli ORDER BY.
- Przypisuje rangę do każdego wiersza w następującej kolejności.
- Zawsze przypisuje rangę wierszom, zaczynając od jednej dla każdej nowej partycji.
UWAGA: Ranga przypisuje tymczasowe wartości wierszom w partycji podczas wykonywania zapytania.
SQL Server udostępnia następujące funkcje rangi :
- RANGA()
- NUMER WIERSZA()
- DENSE_RANK()
- NTYL()
Przyjrzyjmy się szczegółowo każdej funkcji rangi. Najpierw utworzymy tabelę do demonstracji wszystkich tych funkcji. Poniższe instrukcje tworzą tabelę o nazwie ranking_demo z trzema kolumnami:
CREATE TABLE rank_demo ( first_name VARCHAR(60), last_name VARCHAR(40), city VARCHAR(30) );
Następnie wstawimy kilka wierszy do tej tabeli, jak poniżej:
INSERT INTO rank_demo (first_name, last_name, city) VALUES ('Luisa', 'Evans', 'Texas'), ('Paul', 'Ward', 'Alaska'), ('Peter', 'Bennett', 'California'), ('Carlos', 'Patterson', 'New York'), ('Rose', 'Huges', 'Florida'), ('Marielia', 'Simmons', 'Texas'), ('Antonio', 'Butler', 'New York'), ('Diego', 'Cox', 'California');
Tablicę możemy zweryfikować za pomocą instrukcji SELECT. Wyświetla poniższe dane wyjściowe:
RANK() Funkcja
Ta funkcja służy do określenia rangi każdego wiersza w zestawie wyników. Poniższa składnia ilustruje użycie funkcji RANK w SQL Server:
SELECT column_name RANK() OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'my_rank' FROM table_name;
W tej składni
- The Klauzula OVER ustawia podział i kolejność wyniku przed zastosowaniem powiązanej funkcji okna.
- The Klauzula PARTITION BY dzieli wynik uzyskany za pomocą klauzuli FROM na partycję. Następnie funkcja jest stosowana do każdej partycji i ponownie inicjowana, gdy granica podziału przekroczy partycje. Jeśli nie zdefiniowaliśmy tej klauzuli, funkcja potraktuje wszystkie wiersze jako pojedynczą partycję.
- The ZAMÓW PRZEZ to wymagana klauzula, która określa kolejność wierszy w sposób malejący lub rosnący na podstawie jednej lub większej liczby nazw kolumn przed zastosowaniem funkcji.
Przykład
Zobaczmy, jak działa funkcja RANK() w SQL Server. Poniższa instrukcja użyje funkcji rank do przypisania numeracji każdemu wierszowi:
SELECT first_name, last_name, city, RANK () OVER (ORDER BY city) AS Rank_No FROM rank_demo;
Ponieważ nie korzystaliśmy z Klauzula PARTITION BY , funkcja traktowała cały wynik jako pojedynczą partycję. Wykonanie instrukcji wyświetli poniższe dane wyjściowe:
W tym wyniku widzimy, że niektóre wiersze uzyskują tę samą rangę, ponieważ mają tę samą wartość w pliku kolumna miejska . Kolejną liczbą w rankingu będzie jej poprzednia pozycja plus liczba zduplikowanych liczb.
Poniższe stwierdzenie jest inny przykład gdzie użyjemy klauzuli „podział według”, która podzieli wiersze na podstawie miasto kolumnę i przypisz ranking do każdego wiersza w obrębie partycji. Kolejność wyników jest oparta na imię :
SELECT first_name, last_name, city, RANK () OVER (PARTITION BY city ORDER BY first_name) AS Rank_No FROM rank_demo;
Wyświetli poniższe dane wyjściowe:
Funkcja ROW_NUMBER().
Ta funkcja jest do tego przyzwyczajona zwraca unikalny numer kolejny dla każdego wiersza w jego przegrodzie. Numeracja wierszy zaczyna się od jednego i zwiększa się o jeden, aż do osiągnięcia całkowitej liczby wierszy partycji. Zwróci różne rangi dla wiersza o podobnych wartościach, które odróżniają go od funkcji RANK().
Poniższa składnia ilustruje użycie funkcji ROW_NUMBER() w SQL Server:
SELECT column_name ROW_NUMBER() OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'rank_name' FROM table_name;
Przykład
Wykonaj następujące zapytanie, aby przypisać numer kolejny do każdego wiersza:
SELECT first_name, last_name, city, ROW_NUMBER() OVER(ORDER BY city) AS my_rank FROM rank_demo;
Przydzieli ranking tabeli zgodnie z ich miasto . Tutaj widzimy, że przypisuje różne rangi wierszowi, który ma te same wartości miast.
Jeśli zmienimy kolejność sortowania z rosnąco i malejąco z klauzulą ORDER BY, funkcja ta również odpowiednio zmieni RANK. Zobacz poniższe oświadczenie:
SELECT first_name, last_name, city, ROW_NUMBER() OVER(ORDER BY city DESC) AS my_rank FROM rank_demo;
Oto wynik:
Funkcja DENSE_RANK().
Ta funkcja przypisuje unikalna ranga dla każdego wiersza w partycji zgodnie z określoną wartością kolumny, bez żadnych przerw. Zawsze określa ranking w następującej kolejności. Jeśli otrzymamy A zduplikowana wartość , funkcja ta przypisze mu tę samą rangę, a następna ranga będzie kolejnym numerem porządkowym. Ta cecha różni się funkcją DENSE_RANK() od funkcji RANK().
Poniższa składnia ilustruje użycie funkcji DENSE_RANK() w SQL Server:
SELECT column_name DENSE_RANK() OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'rank_name' FROM table_name;
Przykład
Poniższe zapytanie wykorzystuje funkcję DENSE_RANK() w celu przypisania numeru rangi dla każdego wiersza:
SELECT first_name, last_name, city, DENSE_RANK() OVER(ORDER BY city) AS my_rank FROM rank_demo;
Zwróci poniższe dane wyjściowe, gdzie możemy zobaczyć, że zduplikowane wartości mają tę samą rangę, a następna ranga będzie kolejnym numerem sekwencyjnym.
Jest to kolejny przykład funkcji DENSE_RANK() wykorzystującej klauzulę PARTITION BY. Ta klauzula podzieli wiersze na podstawie kolumny miasta, a kolejność zestawu wyników będzie oparta na pierwszym_imię:
SELECT first_name, last_name, city, DENSE_RANK() OVER(PARTITION BY city ORDER BY first_name) AS my_rank FROM rank_demo;
Otrzymamy poniższe dane wyjściowe, ponieważ nie ma dwóch takich samych nazw. W tym przypadku wynik jest podobny do funkcji RANK().
Zaktualizujmy nazwę za pomocą następującego zapytania:
Update rank_demo set first_name = 'Diego' WHERE city = 'California'
Teraz wykonaj ponownie to samo zapytanie. Zobaczymy, że ta tabela ma tę samą nazwę Miasto Kalifornia . Dlatego ranga jest również taka sama dla obu nazw.
Funkcja NTILE(N).
Ta funkcja jest do tego przyzwyczajona rozdziel rzędy uporządkowanej partycji na z góry określoną liczbę (N) w przybliżeniu równych grup. Każda grupa wierszy otrzymuje swoją rangę na podstawie zdefiniowanego warunku i rozpoczyna numerację od jednej grupy. Przypisuje A numer wiadra dla każdego wiersza w grupie reprezentującej grupę, do której należy.
Poniższa składnia ilustruje użycie funkcji NTILE() w SQL Server:
konwersja ciągu na int
SELECT column_name NTILE(N) OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'my_rank' FROM table_name;
Przykład
Poniższe zapytanie używa funkcji NTILE() do przypisania numeru rangi dla każdego wiersza:
SELECT first_name, last_name, city, NTILE(3) OVER(ORDER BY city) AS my_rank FROM rank_demo;
Podana tabela ma osiem rekordów . Dlatego też NTYL(3) mówi, że zestaw wyników musi mieć a grupa trzech rekordów . Wykonanie instrukcji wyświetli poniższe dane wyjściowe:
W tym artykule wyjaśnione zostaną wszystkie funkcje RANK używane w SQL Server na różnych przykładach. Pokazuje także główne różnice pomiędzy tymi funkcjami. Funkcje te są bardzo przydatne dla programistów do dobrego eksplorowania danych i zarządzania nimi.