Jak wybrać co drugi rekord (SELECT co drugi rekord)

15-paź-2011

Jeżeli trzeba wyświetlić co drugi rekord to trzeba sobie odpowiedzieć na pytanie co to znaczy co drugi rekord! Załóżmy, że zamierzam wyświetlić co drugiego pracownika z tabeli Person.Person ze względu na numer pracownika (BusinessEntietyID).

Załóżmy więc, że układam wszystkich pracowników wg ich ID.  Wybór co drugiego jest teraz już prosty z algorytmicznego punktu widzenia. Numerujemy sobie pracowników (np funkcją Row_Number, opisaną już na mobilo).  Potem wybieramy parzystych lub nieparzystych wykorzystując funkcję modulo.

Chciałoby się więc napisać:

SELECT ROW_NUMBER() OVER (ORDER BY BusinessEntityID) AS x, Firstname, LastName
FROM Person.Person p
WHERE x % 2 = 0

niestety nie można, bo nie można się odwołać do aliasu x w klauzuli WHERE.

Więc może tak zadziała:

SELECT ROW_NUMBER() OVER (ORDER BY BusinessEntityID) AS x, Firstname, LastName
FROM Person.Person p
WHERE ROW_NUMBER() OVER (ORDER BY BusinessEntityID)  %2 = 0

ale też nie można:

Msg 4108, Level 15, State 1, Line 1
Windowed functions can only appear in the SELECT or ORDER BY clauses.

Na szczęście mamy podzapytania Włożymy wyżej opisane zapytanie do podzapytania i wtedy klauzula WHERE się powiedzie:

SELECT * FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY BusinessEntityID) AS x, Firstname, LastName
FROM Person.Person p
) s
WHERE s.x %2 = 0

No i gotowe. Więcej podobnych przykładów poznasz na szkoleniach Microsoft. Polecam szkolenie 2778 (Microsoft Opole, Katowice, Warszawa)

Komentarze są wyłączone

Autor: Rafał Kraik