użyj przesunięcia do tego celu ... wybierz rozszerzenie z [dbo]. [Pracownicy] uporządkuj według rozszerzenia malejąco przesunięcie 2 wiersze pobierz tylko następny 1
wiersz
Odpowiedzi:
294
SELECT MAX( col )FROMtableWHERE col <(SELECT MAX( col )FROMtable)
Odpowiedź Matta i Vinoya również dotyczy duplikatów. Załóżmy, że powtórzono największą wartość, a następnie użycie odpowiedzi Matta da poprawną drugą co do wielkości wartość, podczas gdy jeśli użyjesz podejścia 2 górnych desc i min , zamiast tego możesz otrzymać największą wartość.
Pankaj Sharma
A co, jeśli istnieje wiele drugich najwyższych ... Wtedy to nie da wszystkich krotek
Parth Satra
2
Dziękuję, użył tego, aby znaleźć drugą datę ostatniej tutaj
shaijut
Znacznie lepsze niż moje podejście z użyciem ORDER_BY i LIMIT dla wewnętrznego oświadczenia
iig
Zwróć uwagę, że nie zwróci to wyniku, jeśli nie ma żadnych rekordów przed żądanym.
andig
61
SELECT MAX(col)FROMtableWHERE col NOTIN(SELECT MAX(col)FROMtable);
--filter out the maxselect max( col )from[table]where col <(select max( col )from[table])--sort top two then bottom oneselecttop1 col from(selecttop2 col from[table]orderby col) topTwoorderby col desc
W Microsoft SQL pierwszy sposób jest dwa razy szybszy niż drugi, nawet jeśli dana kolumna jest zgrupowana.
Dzieje się tak, ponieważ operacja sortowania jest stosunkowo powolna w porównaniu ze skanowaniem tabeli lub indeksu używanym przez maxagregację.
Alternatywnie w Microsoft SQL 2005 i nowszych możesz użyć ROW_NUMBER()funkcji:
select colfrom(select ROW_NUMBER()over(orderby col asc)as'rowNum', colfrom[table]) withRowNum where rowNum =2
Widzę tutaj zarówno rozwiązania specyficzne dla SQL Server, jak i niektóre rozwiązania specyficzne dla MySQL, więc możesz chcieć wyjaśnić, której bazy danych potrzebujesz. Chociaż gdybym miał zgadywać, powiedziałbym, że SQL Server, ponieważ jest to trywialne w MySQL.
Widzę również rozwiązania, które nie zadziałają, ponieważ nie uwzględniają możliwości duplikatów, więc uważaj, które z nich akceptujesz. Wreszcie widzę kilka, które zadziałają, ale pozwolą na wykonanie dwóch pełnych skanów tabeli. Chcesz się upewnić, że drugi skan dotyczy tylko 2 wartości.
SQL Server (przed 2012):
SELECT MIN([column])AS[column]FROM(SELECTTOP2[column]FROM[Table]GROUPBY[column]ORDERBY[column]DESC) a
To właśnie miałem nadzieję zobaczyć. Zaakceptowana odpowiedź okazuje się brzydka, jeśli potrzebujesz jej do pracy n. Ten wytrzymuje ten test.
Robin Maben
@RobinMaben Robin, a co ze scenariuszem, w którym powtarzana jest największa wartość? Załóżmy, że kolumna zawiera liczby od 1 do 100, ale 100 jest powtarzane dwukrotnie. Wtedy to rozwiązanie da drugą co do wielkości wartość 100, co będzie niepoprawne. Dobrze?
Pankaj Sharma
1
@PankajSharma nie, to nadal będzie działać, z powodu klauzuli GROUP BY
Joel Coehoorn
To jest standardowy sposób na zrobienie tego. Zaakceptowaną odpowiedź należy zaktualizować do tej.
Guilherme Melo
1
Pojawia się błąd, który mówi, że nie mogę użyć TOPi OFFSETw tym samym zapytaniu.
To jest bardzo prosty kod, możesz spróbować tego: -
np .: nazwa tabeli = test
salary
1000150014507500
Kod MSSQL, aby uzyskać drugą co do wielkości wartość
select salary from test orderby salary desc offset 1rowsfetch next 1rows only;
tutaj „przesunięcie 1 wierszy” oznacza drugi wiersz tabeli, a „pobierz tylko następny 1 wiersz” służy do wyświetlenia tylko tego 1 wiersza. jeśli nie użyjesz opcji „pobierz tylko następny 1 wiersz”, zostaną wyświetlone wszystkie wiersze z drugiego wiersza.
Tomek, uwierz, że to się nie powiedzie, gdy w select max([COLUMN_NAME]) from [TABLE_NAME]sekcji zwróconych zostanie więcej niż jedna wartość . tj. gdy w zbiorze danych jest więcej niż 2 wartości.
Odpowiedzi:
źródło
źródło
W T-Sql są dwa sposoby:
W Microsoft SQL pierwszy sposób jest dwa razy szybszy niż drugi, nawet jeśli dana kolumna jest zgrupowana.
Dzieje się tak, ponieważ operacja sortowania jest stosunkowo powolna w porównaniu ze skanowaniem tabeli lub indeksu używanym przez
max
agregację.Alternatywnie w Microsoft SQL 2005 i nowszych możesz użyć
ROW_NUMBER()
funkcji:źródło
Widzę tutaj zarówno rozwiązania specyficzne dla SQL Server, jak i niektóre rozwiązania specyficzne dla MySQL, więc możesz chcieć wyjaśnić, której bazy danych potrzebujesz. Chociaż gdybym miał zgadywać, powiedziałbym, że SQL Server, ponieważ jest to trywialne w MySQL.
Widzę również rozwiązania, które nie zadziałają, ponieważ nie uwzględniają możliwości duplikatów, więc uważaj, które z nich akceptujesz. Wreszcie widzę kilka, które zadziałają, ale pozwolą na wykonanie dwóch pełnych skanów tabeli. Chcesz się upewnić, że drugi skan dotyczy tylko 2 wartości.
SQL Server (przed 2012):
MySQL:
Aktualizacja:
SQL Server 2012 obsługuje teraz znacznie czystszą (i standardową ) składnię OFFSET / FETCH:
źródło
n
. Ten wytrzymuje ten test.TOP
iOFFSET
w tym samym zapytaniu.Przypuszczam, że możesz zrobić coś takiego:
lub
w zależności od serwera bazy danych. Wskazówka: SQL Server nie ma LIMITU.
źródło
OFFSET 2
Najłatwiej byłoby uzyskać drugą wartość z tego zestawu wyników w aplikacji:
Ale jeśli musisz wybrać drugą wartość za pomocą SQL, co powiesz na:
źródło
LIMIT
to składnia MySql, pytanie nie określa wersji SQL.można znaleźć drugą co do wielkości wartość kolumny, używając następującego zapytania
Więcej informacji można znaleźć pod poniższym linkiem
http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html
źródło
Bardzo proste zapytanie mające na celu znalezienie drugiej co do wielkości wartości
źródło
MSSQL
MySQL
Nie ma potrzeby wykonywania zapytań podrzędnych ... po prostu pomiń jeden wiersz i wybierz drugie wiersze po zamówieniu, malejąco
źródło
To zapytanie zwróci maksymalne wynagrodzenie z wyniku - które nie zawiera maksymalnego wynagrodzenia z ogólnej tabeli.
źródło
Stare pytanie, które znam, ale dało mi to lepszy plan wykonawczy:
źródło
To jest bardzo prosty kod, możesz spróbować tego: -
np .: nazwa tabeli = test
Kod MSSQL, aby uzyskać drugą co do wielkości wartość
tutaj „przesunięcie 1 wierszy” oznacza drugi wiersz tabeli, a „pobierz tylko następny 1 wiersz” służy do wyświetlenia tylko tego 1 wiersza. jeśli nie użyjesz opcji „pobierz tylko następny 1 wiersz”, zostaną wyświetlone wszystkie wiersze z drugiego wiersza.
źródło
Mam nadzieję, że pomoże to uzyskać wartość dla dowolnego wiersza…
źródło
Najprostszy ze wszystkich
źródło
Uwaga
sal to nazwa kol.
emp to nazwa tabeli
źródło
Tomek, uwierz, że to się nie powiedzie, gdy w
select max([COLUMN_NAME]) from [TABLE_NAME]
sekcji zwróconych zostanie więcej niż jedna wartość . tj. gdy w zbiorze danych jest więcej niż 2 wartości.Nieznaczna modyfikacja zapytania zadziała -
źródło
podzapytanie zwraca wszystkie wartości inne niż największe. wybierz maksymalną wartość ze zwróconej listy.
źródło
źródło
źródło
To najzwyczajniejszy sposób:
źródło
źródło
Jak wspomniałeś zduplikowane wartości. W takim przypadku możesz użyć DISTINCT i GROUP BY, aby znaleźć drugą najwyższą wartość
Oto stół
:
Pierwsza część LIMIT = indeks początkowy
Druga część LIMITU = ile wartości
źródło
zwróci to trzecią najwyższą salę tabeli emp
źródło
nie w to warunek wykluczający najwyższą wartość nazwa_kolumny.
Odniesienie: wywiad z programistą
źródło
Coś takiego? Jednak nie testowałem tego:
źródło
Zobacz Jak wybrać n-ty wiersz w tabeli bazy danych SQL? .
Sybase SQL Anywhere obsługuje:
źródło
Korzystanie z zapytania skorelowanego:
źródło
To zapytanie wybiera maksymalnie trzy pensje. Jeśli dwa pracownicy otrzymują taką samą pensję, nie ma to wpływu na zapytanie.
źródło
źródło
Działa to w MS SQL:
źródło