Jakie jest najprostsze zapytanie SQL do znalezienia drugiej co do wielkości liczby całkowitej w określonej kolumnie?
W kolumnie mogą być zduplikowane wartości.
Jakie jest najprostsze zapytanie SQL do znalezienia drugiej co do wielkości liczby całkowitej w określonej kolumnie?
W kolumnie mogą być zduplikowane wartości.
Odpowiedzi:
SELECT MAX( col )
FROM table
WHERE col < ( SELECT MAX( col )
FROM table )
W T-Sql są dwa sposoby:
--filter out the max
select max( col )
from [table]
where col < (
select max( col )
from [table] )
--sort top two then bottom one
select top 1 col
from (
select top 2 col
from [table]
order by col) topTwo
order by 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 max
agregację.
Alternatywnie w Microsoft SQL 2005 i nowszych możesz użyć ROW_NUMBER()
funkcji:
select col
from (
select ROW_NUMBER() over (order by col asc) as 'rowNum', col
from [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 (
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
) a
MySQL:
SELECT `column`
FROM `table`
GROUP BY `column`
ORDER BY `column` DESC
LIMIT 1,1
Aktualizacja:
SQL Server 2012 obsługuje teraz znacznie czystszą (i standardową ) składnię OFFSET / FETCH:
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;
n
. Ten wytrzymuje ten test.
TOP
i OFFSET
w tym samym zapytaniu.
Przypuszczam, że możesz zrobić coś takiego:
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1
lub
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)
w zależności od serwera bazy danych. Wskazówka: SQL Server nie ma LIMITU.
OFFSET 2
Najłatwiej byłoby uzyskać drugą wartość z tego zestawu wyników w aplikacji:
SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2
Ale jeśli musisz wybrać drugą wartość za pomocą SQL, co powiesz na:
SELECT MIN(value) FROM (SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2) AS t
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
SELECT *
FROM TableName a
WHERE
2 = (SELECT count(DISTINCT(b.ColumnName))
FROM TableName b WHERE
a.ColumnName <= b.ColumnName);
Więcej informacji można znaleźć pod poniższym linkiem
http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html
MSSQL
SELECT *
FROM [Users]
order by UserId desc OFFSET 1 ROW
FETCH NEXT 1 ROW ONLY;
MySQL
SELECT *
FROM Users
order by UserId desc LIMIT 1 OFFSET 1
Nie ma potrzeby wykonywania zapytań podrzędnych ... po prostu pomiń jeden wiersz i wybierz drugie wiersze po zamówieniu, malejąco
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )
To zapytanie zwróci maksymalne wynagrodzenie z wyniku - które nie zawiera maksymalnego wynagrodzenia z ogólnej tabeli.
To jest bardzo prosty kod, możesz spróbować tego: -
np .: nazwa tabeli = test
salary
1000
1500
1450
7500
Kod MSSQL, aby uzyskać drugą co do wielkości wartość
select salary from test order by salary desc offset 1 rows fetch next 1 rows 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.
select * from (select ROW_NUMBER() over (Order by Col_x desc) as Row, Col_1
from table_1)as table_new tn inner join table_1 t1
on tn.col_1 = t1.col_1
where row = 2
Mam nadzieję, że pomoże to uzyskać wartość dla dowolnego 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.
Nieznaczna modyfikacja zapytania zadziała -
select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] **IN**
( select max([COLUMN_NAME]) from [TABLE_NAME] )
SELECT
*
FROM
table
WHERE
column < (SELECT max(columnq) FROM table)
ORDER BY
column DESC LIMIT 1
To najzwyczajniejszy sposób:
SELECT
Column name
FROM
Table name
ORDER BY
Column name DESC
LIMIT 1,1
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ół
wynagrodzenie
:
GRUPUJ WEDŁUG
SELECT amount FROM salary
GROUP by amount
ORDER BY amount DESC
LIMIT 1 , 1
ODRĘBNY
SELECT DISTINCT amount
FROM salary
ORDER BY amount DESC
LIMIT 1 , 1
Pierwsza część LIMIT = indeks początkowy
Druga część LIMITU = ile wartości
select max(column_name) from table_name
where column_name not in (select max(column_name) from table_name);
nie w to warunek wykluczający najwyższą wartość nazwa_kolumny.
Odniesienie: wywiad z programistą
Zobacz Jak wybrać n-ty wiersz w tabeli bazy danych SQL? .
Sybase SQL Anywhere obsługuje:
SELECT TOP 1 START AT 2 value from table ORDER BY value
select top 1 MyIntColumn from MyTable
where
MyIntColumn <> (select top 1 MyIntColumn from MyTable order by MyIntColumn desc)
order by MyIntColumn desc