Mateusz Mazurek – programista z pasją

Czyli o użyciu Pythona i kilku innych technologii do tworzenia świetnej jakości aplikacji w oparciu o stabilny proces dostarczania oprogramowania.

Programowanie

[SQL] Jak wybrać drugą największą wartość z kolumny?

Zakładamy że mamy taką oto tabelę:

Osoby
——-
idOsoby
Imie
Wiek
Nazwisko

oraz takie dane:

IdOsobyImieWiekNazwisko
1Mateusz21Mazurek
2Michał36Dorycki
3Kamil37Dudło
4Sebastian19Tabelowski
5Łukasz12Wlazło
6Maciej36Prędki

 

Chciałbym wybrać z tej tabeli wiek osoby która jest młodsza od najstaszej osoby ale starsza od pozostałych osób.

Czyli druga wartość jeśli byśmy sortowali malejąco po wieku.

Skorzystamy z podzapytań (subqueries). Zapytanie wewnętrzne zwracać będzie 2 pierwsze rekordy z tych posortowanych malejąco, czyli od największego do najmniejszego. A z tego wyniku wybierzemy najmniejszą wartość.

Czyli z podzapytania weźmiemy:

IdOsobyImieWiekNazwisko
3Kamil37Dudło
2Michał36Dorycki

A następnie z tego weźmiemy najmniejszą wartość wieku. Co będzie równoznaczne z 2 co do kolejności malejącej wartość wieku z całej tabeli :)

Zapytanie:

1
2
3
SELECT MIN(Wiek) AS secondvalue
FROM
(SELECT TOP(2) * FROM dbo.Osoby ORDER BY Osoby.Wiek DESC) AS r
Dzięki za wizytę,
Mateusz Mazurek

A może wolisz nowości na mail?

Subskrybuj
Powiadom o
guest

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

5 komentarzy
Inline Feedbacks
View all comments
ela

Przydało się, dziękuję

ela2

mi tez mordo

Wiktor

Wydaje mi się, choć mogę się mylić, że TOP(2) nie jest tu właściwym rozwiązaniem. Sortując malejąco wiersze w tabeli (podzapytanie), otrzymujemy: ——————————- Kamil Dudło 37 Michał Dorycki 36 ← wybieramy tą osobę Maciej Predki 36 ← ale ta również jest dobrym kandydatem ——————————- Moim zdaniem wynikiem zapytania powinny być obydwie w.w. osoby, ponieważ w zadaniu nie mamy żadnego kryterium (kolejność alfabetyczna, długość imienia), żeby wybrać akurat Michała Doryckiego. Sprawa ma się podobnie do miejsc w rankingu w danych zawodach, jeśli 2 osoby mają po 1000 pkt, to w rankingu są ex aeqo. Wydaje mi się, że należy złączyć podaną tabelę… Czytaj więcej »

Wiktor

Faktycznie, po tym jak Pan odpisał jeszcze raz przeczytałem dokładnie o czym jest wpis na blogu. Generalnie mój problem brzmiał „Wybrać dane osób młodszych od najstarszej osoby, ale też starszych od reszty”. Problem został rozwiązany i jeśli to może się komuś przydać wrzucam zapytanie, które robi ranking uzwględniający miejsca ax aeqo: [ 1 Sposób ] SELECT wiek, imie, nazwisko FROM Osoby O WHERE (SELECT COUNT(DISTINCT wiek) FROM Osoby WHERE wiek > O.wiek) = 1; [ 2 Sposób ] SELECT A.wiek, A.imie, A.nazwisko, COUNT(DISTINCT B.wiek) FROM Osoby A LEFT JOIN Osoby B ON A.wiek < B.wiek GROUP BY A.wiek, A.imie, A.nazwisko… Czytaj więcej »