logo

Funkcja SQL Server Row_Number z PARTYCJĄ BY

Funkcja numeru wiersza jest jedną z funkcji okna służącą do przypisywania numeru wiersza wierszom w każdej z przegród w kolejności, w jakiej zostały one posortowane w przegrodzie za pomocą PRZEGRODA klauzula, PARTYCJA tylko ZAMÓWIENIE klauzulę można zastosować wewnątrz klauzuli OVER, wówczas cała tabela będzie traktowana jako jedna partycja. Ale klauzula ORDER BY jest obowiązkowa przy użyciu NUMER WIERSZA() funkcja, ponieważ porządkuje wiersze w partycjach w tej logicznej kolejności, a później funkcja ROW_NUMBER() może przypisać numer wiersza. W każdej partycji numer wiersza zaczyna się od 1.

Składnia:



NUMER WIERSZA ( )

OVER ( [ PARTITION BY col_1,col_2… ] ORDER BY col_3,col_4.. ASC lub DESC) AS nazwa_kolumny

Składniki funkcji ROW_NUMBER().



  • PODZIAŁ WEDŁUG: Jest to główna klauzula podrzędna, która dzieli wiersze na okna i dla każdego wiersza wartości funkcje okna zastosowane zostanie obliczone.
  • ZAMÓW PRZEZ: Służy do porządkowania wierszy w partycji, domyślnie jest to porządek rosnący. Bez klauzuli ORDER BY funkcja ROW_NUMBER() nie działa.
  • Typ zwrotu: Typ zwracany przez funkcję ROW_NUMBER() to BIGINT.

Użycie funkcji ROW_NUMBER().

Krok 1: Utwórz bazę danych Geeksforgeeks, używając następującego zapytania SQL:

Zapytanie

CREATE DATABASE Geeksforgeeks>

Skorzystaj z bazy danych GFG.



Zapytanie

USE techcodeview.com>

Krok 3: Utwórz tabelę zawierającą uczniów z różnych sekcji i ich łączną liczbę punktów na poziomie 500.

Zapytanie

CREATE TABLE studentsSectionWise( studentId INT, studentName VARCHAR(100), sectionName VARCHAR(50), studentMarks INT  );>

Krok 4: Wstaw wiersze do tabeli:

Zapytanie

INSERT INTO studentsSectionWise VALUES (1, 'Geek1','A',461), (1, 'Geek2','B',401), (1, 'Geek3','C',340), (2, 'Geek4','A',446), (2, 'Geek5','B',361), (2, 'Geek6','C',495), (3, 'Geek7','A',436), (3, 'Geek8','B',367), (3, 'Geek9','C',498), (4, 'Geek10','A',206), (4, 'Geek11','B',365), (4, 'Geek12','C',485), (5, 'Geek13','A',446), (5, 'Geek14','B',368),  (5, 'Geek15','C',295),  (6, 'Geek16','C',495);>

Krok 5: Sprawdź tabelę

SELECT * FROM studentsSectionWise>

Wyjście:

studenciSekcjaWise-Table

tabela SekcjaWise dla studentów

przykład Java Hello World

Używanie klauzuli ORDER_BY z funkcją ROW_NUMBER().

Użycie samej klauzuli ORDER BY z rosnącą lub malejącą wartością traktuje całą tabelę jako tylko jedną partycję.

Sprawdźmy rankNumber uczniów za pomocą funkcji ROW_NUMBER() z klauzulą ​​ORDER BY uwzględniającą wszystkie sekcje:

SELECT * , ROW_NUMBER() OVER ( ORDER BY studentMarks DESC) AS rankNumber FROM studentsSectionWise>

Wyjaśnienie: W zapytaniu użyliśmy klauzuli ORDER BY ze znacznikami uczniów, która jest uporządkowana w kolejności DESC.

Wyjście:

wyjście

Wyjście

Wyjaśnienie: W rezultacie widzimy, że cała tabela jest traktowana jako pojedyncza partycja, a liczba rangNumber jest w kolejności rosnącej, a oceny uczniów w kolejności malejącej.

Używanie PARTITION_BY z funkcją ROW_NUMBER().

Użycie prostej klauzuli PARTITION BY dzieli tabelę na różne partycje w oparciu o nazwę kolumny, a następnie klauzuli ORDER BY z rosnącą lub malejącą wartością powoduje, że cała tabela jest tylko jedną partycją. Następnie funkcja ROW_NUMBER() obsługuje każdy unikalny numer, zaczynając od 1 w każdej partycji.

Sprawdźmy pod kątem sekcji rankingowej funkcję ROW_NUMBER() z klauzulami PARTITION BY i ORDER BY.

SELECT * , ROW_NUMBER() OVER (PARTITION BY sectionName ORDER BY studentMarks DESC) AS rankNumber FROM studentsSectionWise;>

Wyjaśnienie: W zapytaniu, którego użyliśmy Klauzula PARTITION BY aby podzielić tabelę na sekcjęNazwa i klauzulę ORDER BY ze znakami uczniów, które są uporządkowane w DESC.

Wyjście:

wyjście

Wyjście

Wyjaśnienie: W rezultacie widzimy, że mamy partycje podzielone według nazwy sekcji, a następnie w każdej partycji uczniowie są uporządkowani na podstawie ocen uczniów w kolejności DESC, funkcja ROW_NUMBER() przypisuje numer wiersza zaczynając od każdej partycji i zwiększa go .

Zrozumienie ROW_NUMBER() bez PARTITION BY

Funkcja ROW_NUMBER() programu SQL Server to elastyczne narzędzie, które umożliwia nadanie każdemu wierszowi w zestawie wyników unikalnego numeru wiersza. Jest równie skuteczny, gdy jest używany bez klauzuli PARTITION BY, mimo że często jest używany w połączeniu z nią do grupowania i rankingu w obrębie partycji. Możliwości i zastosowania ROW_NUMBER() bez klauzuli PARTITION BY zostaną omówione w tym artykule.

Składnia:

WYBIERAĆ

ROW_NUMBER() PONAD ( ZAMÓW PRZEZ Twoje zamówienie według kolumny) JAK Liczba wierszy,

Inne kolumny

Z

Twoja nazwa tabeli;

Sprawdźmy sekcję rankingową pod kątem funkcji ROW_NUMBER() bez klauzul PARTITION BY i ORDER BY.

SELECT * , ROW_NUMBER() OVER (ORDER BY studentMarks DESC) AS rankNumber FROM studentsSectionWise>

Wyjście:

wyjście

Wyjście

Użycie ROW_NUMBER() do pobrania podzbioru wierszy

Za pomocą funkcji ROW_NUMBER() można pobrać podzbiór wierszy z tabeli za pomocą współczynnika CTE, co może być przydatne w przypadku paginacji danych.

Sprawdźmy 2 najlepszych graczy w każdej klasie za pomocą CTE (wspólne wyrażenie tabelowe) z funkcją ROW_NUMBER():

WITH topTwoRankers AS  (   SELECT * , ROW_NUMBER() OVER (PARTITION BY sectionName ORDER BY studentMarks DESC) AS rankNumber  FROM studentsSectionWise  )  SELECT *  FROM topTwoRankers  WHERE rankNumber <=2;>

Wyjaśnienie: W tym zapytaniu użyliśmy wyrażenia CTE, aby uzyskać tabelę tymczasową z zapytania użytego powyżej, a zewnętrznego zapytania SELCT użyliśmy do uzyskania uczniów, których numer rangi jest mniejszy lub równy 2.

Wyjście:

wyjście

Wyjście

Wyjaśnienie: W rezultacie widzimy, że mamy 2 najwyższe rankingi z każdej sekcji, które stanowią podzbiór tabeli uzyskanej z zapytania pokazanego w poprzednim przykładzie.

ZaletyROW_NUMBER()>Z PARTYCJĄ PRZEZ

  1. Umożliwia zaawansowany ranking partycji.
  2. Umożliwia unikalną numerację wierszy w obrębie określonych grup.
  3. Pozwala na większą elastyczność w sytuacjach wymagających obszernej analizy.

ZaletyROW_NUMBER()>Bez PARTITION BY

  1. Prosto i prosto.
  2. ułatwia sortowanie elementów według określonej kolumny.
  3. Może oferować lepszą wydajność, szczególnie w przypadku mniejszych zestawów wyników.

Wniosek

Jest to bardzo przydatne, gdy chcemy mieć sekwencjonowanie na podstawie partycji i wykonać niezbędne operacje. Za pomocą Klauzula ORDER BY jest obowiązkowe podczas korzystania z funkcji ROW_NUMBER(). Również używając CTE możemy uzyskać podzbiory tabeli z uporządkowanych partycji. Głównym przypadkiem użycia ROW_NUMBER() jest ranking wierszy na podstawie różnych partycji, co jest bardzo przydatne do celów analizy danych.