Який найпростіший запит SQL для пошуку другого за величиною цілого значення в конкретному стовпчику?
У стовпчику можуть бути дублюючі значення.
Який найпростіший запит SQL для пошуку другого за величиною цілого значення в конкретному стовпчику?
У стовпчику можуть бути дублюючі значення.
Відповіді:
SELECT MAX( col )
FROM table
WHERE col < ( SELECT MAX( col )
FROM table )
У T-Sql є два способи:
--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
У Microsoft SQL перший спосіб удвічі швидший за другий, навіть якщо стовпчик, про який йде мова, кластеризований.
Це відбувається тому, що операція сортування порівняно повільна в порівнянні з таблицею або скануванням індексу, яку використовує max
агрегація.
Крім того, в Microsoft SQL 2005 і вище ви можете використовувати ROW_NUMBER()
функцію:
select col
from (
select ROW_NUMBER() over (order by col asc) as 'rowNum', col
from [table] ) withRowNum
where rowNum = 2
Тут я бачу як деякі специфічні для SQL Server, так і деякі специфічні для MySQL рішення, тож ви можете уточнити, яка база даних вам потрібна. Хоча якби мені довелося здогадуватися, я б сказав SQL Server, оскільки це тривіально в MySQL.
Я також бачу деякі рішення, які не будуть працювати, оскільки вони не враховують можливість дублікатів, тому будьте уважні, які з них ви приймаєте. Нарешті, я бачу декілька, які будуть працювати, але це дозволить зробити два повних сканування таблиці. Ви хочете переконатися, що 2-е сканування дивиться лише на 2 значення.
SQL Server (до 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
Оновлення:
Тепер SQL Server 2012 підтримує набагато чистіший (і стандартний ) синтаксис OFFSET / FETCH:
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;
n
. Цей - це тест.
TOP
і OFFSET
в тому самому запиті.
Я думаю, ви можете зробити щось на кшталт:
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1
або
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)
залежно від вашого сервера баз даних. Підказка: SQL Server не робить LIMIT.
OFFSET 2
Найпростіше було б отримати друге значення з цього результату, встановленого в додатку:
SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2
Але якщо вам потрібно вибрати друге значення за допомогою SQL, як щодо:
SELECT MIN(value) FROM (SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2) AS t
LIMIT
це синтаксис MySql, питання не визначає версію SQL.
ви можете знайти друге за величиною значення стовпця, скориставшись наступним запитом
SELECT *
FROM TableName a
WHERE
2 = (SELECT count(DISTINCT(b.ColumnName))
FROM TableName b WHERE
a.ColumnName <= b.ColumnName);
Ви можете знайти більш детальну інформацію за наступним посиланням
http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html
Дуже простий запит, щоб знайти друге за величиною значення
SELECT `Column` FROM `Table` ORDER BY `Column` DESC LIMIT 1,1;
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
Не потрібні додаткові запити ... просто пропустіть один рядок та виберіть другі рядки після замовлення за убуванням
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )
Цей запит поверне максимальну зарплату, від результату - яка не містить максимальної зарплати із загальної таблиці.
Це дуже простий код, ви можете спробувати це: -
напр .: Назва таблиці = тест
salary
1000
1500
1450
7500
Код MSSQL, щоб отримати 2-е за величиною значення
select salary from test order by salary desc offset 1 rows fetch next 1 rows only;
тут "зміщення 1 рядка" означає 2-й рядок таблиці, а "отримати лише наступні 1 рядок" - для показу лише той 1 рядок. якщо ви не використовуєте "отримати лише наступні 1 рядок", він відображає всі рядки з другого ряду.
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
Сподіваємось, це допоможе отримати значення для будь-якого рядка .....
Том, віри, це не вдасться, коли в select max([COLUMN_NAME]) from [TABLE_NAME]
розділі повернеться більше одного значення . тобто там, де в наборі даних більше двох значень.
Незначна модифікація вашого запиту спрацює -
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
Це найесетичніший спосіб:
SELECT
Column name
FROM
Table name
ORDER BY
Column name DESC
LIMIT 1,1
Як ви згадали дублюючі значення. У такому випадку ви можете використовувати DISTINCT та GROUP BY щоб дізнатися друге найвище значення
Ось таблиця
зарплата
:
ГРУПА ПО
SELECT amount FROM salary
GROUP by amount
ORDER BY amount DESC
LIMIT 1 , 1
ДИСТИНКТ
SELECT DISTINCT amount
FROM salary
ORDER BY amount DESC
LIMIT 1 , 1
Перша частина LIMIT = стартовий індекс
Друга частина LIMIT = скільки значень
select max(column_name) from table_name
where column_name not in (select max(column_name) from table_name);
не в - це умова, яка виключає найвище значення імені стовпця.
Довідка: інтерв'ю програміста
Див. Як вибрати n-й рядок у таблиці бази даних SQL? .
Sybase SQL Anywhere підтримує:
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