Numer wiersza jest najczęstszy funkcja rankingowa używany w SQL Server. Funkcja ROW_NUMBER(). generuje numer kolejny dla każdego wiersza w partycji w wynikowym wyjściu. W każdej partycji numer pierwszego wiersza zaczyna się od 1. Zawsze musimy używać ZAMÓW PRZEZ klauzulę zapewniającą przypisanie numerów we właściwej kolejności. Wartości zwracane przez tę funkcję to DUŻY WEWN typ danych. Ta funkcja jest dostępna w SQL Server 2005 i nowszych wersjach MS SQL.
ROW_NUMBER określa wartość tymczasowa kiedy zapytanie jest wykonywane. Jeśli chcesz uzyskać liczby w tabeli, musisz zobaczyć TOŻSAMOŚĆ własność i SEKWENCJA . Gdy funkcja ROW_NUMBER w SQL Server napotka dwie identyczne wartości w tej samej partycji, przypisuje im różne numery rangi. Numer rangi zostanie określony na podstawie kolejności ich wyświetlania.
Nie ma gwarancji, że wartość zwrócona przez tę funkcję będzie taka sama przy każdym wykonaniu, chyba że spełnione są następujące warunki:
- Wartości kolumn podzielonych są unikalne
- ORDER BY wartości kolumn są unikalne
- Kombinacja kolumn Partition i Order By jest unikalna
Składnia
Poniżej przedstawiono składnię ilustrującą funkcję ROW_NUMBER():
ROW_NUMBER() OVER ( [PARTITION BY partition_expression, ... ] ORDER BY sort_expression [ASC | DESC], ... )
Przyjrzyjmy się składni funkcji NUMER WIERSZA():
NAD
Ważne jest, aby zrozumieć tę klauzulę, która określa okno lub zestaw wierszy, w których działa funkcja okna. PARTITION BY i ORDER BY to dwie możliwe klauzule klauzuli OVER. Wyrażenie ORDER BY klauzuli OVER jest obsługiwane, gdy wiersze muszą znajdować się w określonej kolejności, aby funkcja mogła zostać wykonana.
PODZIAŁ WG
- Jest to opcjonalna klauzula, która dzieli zbiór wyników na partycje (grupy wierszy). Następnie do każdej partycji stosowana jest funkcja ROW NUMBER() i przypisuje każdej partycji numer rangi oddzielnie.
- Jeśli pominiemy klauzulę „Partition by”, funkcja ROW_NUMBER potraktuje cały wynik jako pojedynczą partycję i zapewni ranking w kolejności od góry do dołu.
ZAMÓW PRZEZ
Ta klauzula pozwala nam sortować wiersze zestawu wyników w każdej partycji. Jest to klauzula wymagana, ponieważ funkcja ROW_NUMBER() jest zależna od kolejności.
Przykład
Zobaczmy na przykładzie, jak działa funkcja ROW_NUMBER w tabeli SQL Server. Najpierw utworzymy tabelę o nazwie „ Osoby ' używając poniższej instrukcji:
CREATE TABLE Persons ( person_name varchar(45) NOT NULL, product varchar(45) DEFAULT NULL, country varchar(25) DEFAULT NULL, price float, years int NOT NULL );
Następnie dodamy kilka rekordów do tej tabeli, korzystając z poniższej instrukcji:
INSERT INTO Persons (person_name, product, country, price, years) VALUES ('Steffen', 'Computer', 'USA', 20000.00, 2018), ('Joseph', 'Laptop', 'India', 35000.00, 2016), ('Kevin', 'TV', 'USA', 15000.00, 2016), ('Thompson', 'Mobile', 'France', 12500.00, 2017), ('Donald', 'Laptop', 'England', 30000.00, 2018), ('Joseph', 'Mobile', 'India', 18000.00, 2018), ('Matthew', 'Desktop', 'France', 22000.00, 2017), ('Antonio', 'Mouse', 'England', 1200.00, 2016);
Następnie zweryfikuj dane za pomocą WYBIERAĆ oświadczenie. Otrzymamy poniższe dane wyjściowe:
1. Prosty przykład ROW_NUMBER().
Poniższe oświadczenie wyświetla szczegółowe informacje o osobie i dodaje kolejną liczbę całkowitą do każdego wiersza za pomocą ROW_NUMBER():
SELECT *, ROW_NUMBER() OVER (ORDER BY price) AS row_num FROM Persons;
Tutaj nie określiliśmy klauzuli PARTITION BY, więc funkcja ROW_NUMBER() będzie traktowała cały zestaw wyników jako pojedynczą partycję. Po wykonaniu instrukcji otrzymamy następujący wynik:
2. ROW_NUMBER() na przykładzie partycji
W tym przykładzie użyto funkcji NUMER WIERSZA(), która zapewnia numer kolejny każdemu rekordowi w obrębie partycji tabeli. Zawsze ponownie inicjował numer wiersza, gdy zmienia się rok:
SELECT person_name, product, price, years, ROW_NUMBER() OVER ( PARTITION BY years ORDER BY price) AS row_num FROM Persons;
Tutaj użyliśmy klauzuli PARTITION BY, która dzieli „Osoby” tabelę na partycje w oparciu o „lata” kolumna. Po wykonaniu otrzymamy poniższe dane wyjściowe:
3. ROW_NUMBER() Przykład paginacji
Do paginacji możemy także użyć funkcji ROW_NUMBER(). Na przykład , jeśli chcemy uzyskać wszystkie informacje o osobie w aplikacji według stron, najpierw przypiszemy każdemu wierszowi kolejny numer za pomocą funkcji ROW_NUMBER(). Po drugie, posortuj wiersze według żądanej strony.
Poniższe stwierdzenie wyjaśnia to jaśniej:
SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY price) AS row_num, person_name, product, price FROM Persons) P WHERE row_num > 3 AND row_num <= 6; < pre> <p>It will give the following output:</p> <img src="//techcodeview.com/img/sql-server-tutorials/96/sql-server-row-number-4.webp" alt="SQL Server Row Number"> <p>If we do not want to use the <strong>subquery</strong> , we can use the <strong>common table expression (CTE)</strong> as below statement:</p> <pre> WITH CTE_Person AS ( SELECT ROW_NUMBER() OVER (ORDER BY price) AS row_num, person_name, product, price FROM Persons) SELECT * FROM CTE_Person WHERE row_num > 3 AND row_num <= 6; < pre> <p>In this example, we have first specified the CTE that uses the ROW_NUMBER() function to assign each row in the result set sequentially. Second, the outer query returned the desired result. After execution, we will get the following output:</p> <img src="//techcodeview.com/img/sql-server-tutorials/96/sql-server-row-number-5.webp" alt="SQL Server Row Number"> <h3>Conclusion</h3> <p>In this article, we learned how to give a sequential number to each record within a partition of a query using the ROW NUMBER() function in SQL Server.</p> <hr></=></pre></=>=>