используйте смещение для этой цели ... выберите расширение из [dbo]. Порядок [Сотрудники] по расширению desc смещение 2 строки выбирают только следующие 1 строки
Jinto John
Ответы:
295
SELECT MAX( col )FROMtableWHERE col <(SELECT MAX( col )FROMtable)
Ответ Мэтта, а также ответа Виной заботится о дубликатах. Предположим, что наибольшее значение повторяется, а затем, используя ответ Мэтта, получится правильное второе по величине значение, в то время как, если вы использовали подход 2 верхних и минимальных значений, вы можете получить наибольшее значение.
Панкадж Шарма
Что если есть несколько секунд наивысшего ... Тогда это не даст всем кортежам
Parth Satra
2
спасибо, использовал это, чтобы найти второе последнее свидание здесь
shaijut
Намного лучше, чем мой подход, использующий ORDER_BY и LIMIT для внутреннего утверждения
andig
Обратите внимание, что это не вернет результат, если нет записей до запрошенной.
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) topTwo
orderby col desc
В Microsoft SQL первый способ в два раза быстрее второго, даже если рассматриваемый столбец кластеризован.
Это связано с тем, что операция сортировки выполняется относительно медленно по сравнению со сканированием таблицы или индекса, которое maxиспользует агрегация.
В качестве альтернативы, в Microsoft SQL 2005 и выше вы можете использовать ROW_NUMBER()функцию:
select col
from(select ROW_NUMBER()over(orderby col asc)as'rowNum', col
from[table]) withRowNum
where rowNum =2
Я вижу как некоторые специфичные для SQL Server, так и некоторые специфичные для MySQL решения, поэтому вы можете уточнить, какая база данных вам нужна. Хотя, если бы мне пришлось угадывать, я бы сказал, что SQL Server, поскольку в MySQL это тривиально.
Я также вижу некоторые решения, которые не будут работать, потому что они не учитывают возможность дублирования, поэтому будьте осторожны, какие из них вы принимаете. Наконец, я вижу несколько, которые будут работать, но это сделает два полных сканирования таблицы. Вы хотите убедиться, что второе сканирование просматривает только 2 значения.
SQL Server (до 2012 года):
SELECT MIN([column])AS[column]FROM(SELECTTOP2[column]FROM[Table]GROUPBY[column]ORDERBY[column]DESC) a
Это то, что я надеялся увидеть. Принятый ответ становится уродливым, если вам нужно, чтобы он работал для любого n. Этот выдерживает этот тест.
Робин Мабен
@RobinMaben Робин, как насчет сценария, когда наибольшее значение повторяется? Предположим, что столбец содержит числа от 1 до 100, но 100 повторяется дважды. Тогда это решение выдаст второе по величине значение как 100, что будет неверным. Правильно?
Панкадж Шарма
1
@PankajSharma нет, это все еще будет работать, из-за предложения GROUP BY
Джоэль Коухорн
Это стандартный способ сделать это. Принятый ответ должен быть обновлен до этого.
Гильерме Мело
1
Я получаю ошибку, которая говорит, что я не могу использовать TOPи OFFSETв том же запросе.
Это очень простой код, вы можете попробовать это: -
пример: имя таблицы = тест
salary
1000150014507500
Код MSSQL для получения второго по величине значения
select salary from test orderby salary desc offset 1rowsfetch next 1rows only;
здесь 'смещение 1 строки' означает 2-ю строку таблицы, а 'выборка только для следующих 1 строки' - для показа только этой 1 строки. если вы не используете «извлечь только следующие 1 строки», тогда будут показаны все строки из второй строки.
Том, поверь, это не удастся, если в select max([COLUMN_NAME]) from [TABLE_NAME]разделе будет возвращено более одного значения . то есть где в наборе данных более 2 значений.
Небольшая модификация вашего запроса будет работать -
Ответы:
источник
источник
В T-Sql есть два способа:
В Microsoft SQL первый способ в два раза быстрее второго, даже если рассматриваемый столбец кластеризован.
Это связано с тем, что операция сортировки выполняется относительно медленно по сравнению со сканированием таблицы или индекса, которое
max
использует агрегация.В качестве альтернативы, в Microsoft SQL 2005 и выше вы можете использовать
ROW_NUMBER()
функцию:источник
Я вижу как некоторые специфичные для SQL Server, так и некоторые специфичные для MySQL решения, поэтому вы можете уточнить, какая база данных вам нужна. Хотя, если бы мне пришлось угадывать, я бы сказал, что SQL Server, поскольку в MySQL это тривиально.
Я также вижу некоторые решения, которые не будут работать, потому что они не учитывают возможность дублирования, поэтому будьте осторожны, какие из них вы принимаете. Наконец, я вижу несколько, которые будут работать, но это сделает два полных сканирования таблицы. Вы хотите убедиться, что второе сканирование просматривает только 2 значения.
SQL Server (до 2012 года):
MySQL:
Обновить:
SQL Server 2012 теперь поддерживает намного более чистый (и стандартный ) синтаксис OFFSET / FETCH:
источник
n
. Этот выдерживает этот тест.TOP
иOFFSET
в том же запросе.Я полагаю, вы можете сделать что-то вроде:
или
в зависимости от вашего сервера базы данных. Подсказка: SQL Server не выполняет LIMIT.
источник
OFFSET 2
Проще всего было бы получить второе значение из этого набора результатов в приложении:
Но если вам нужно выбрать второе значение с помощью SQL, как насчет:
источник
LIMIT
это синтаксис MySql, вопрос не указывает версию SQL.Вы можете найти второе по величине значение столбца, используя следующий запрос
Вы можете найти более подробную информацию по следующей ссылке
http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html
источник
Очень простой запрос, чтобы найти второе по величине значение
источник
MSSQL
MySQL
Нет необходимости в подзапросах ... просто пропустите одну строку и выберите вторые строки после заказа по убыванию
источник
Этот запрос вернет максимальный оклад из результата, который не содержит максимальный оклад из общей таблицы.
источник
Старый вопрос, который я знаю, но это дало мне лучший план для исполнительной власти:
источник
Это очень простой код, вы можете попробовать это: -
пример: имя таблицы = тест
Код MSSQL для получения второго по величине значения
здесь 'смещение 1 строки' означает 2-ю строку таблицы, а 'выборка только для следующих 1 строки' - для показа только этой 1 строки. если вы не используете «извлечь только следующие 1 строки», тогда будут показаны все строки из второй строки.
источник
Надеюсь, что это поможет получить значение для любой строки .....
источник
Самый простой из всех
источник
Заметка
sal - имя
столбца emp - имя таблицы
источник
Том, поверь, это не удастся, если в
select max([COLUMN_NAME]) from [TABLE_NAME]
разделе будет возвращено более одного значения . то есть где в наборе данных более 2 значений.Небольшая модификация вашего запроса будет работать -
источник
подзапрос возвращает все значения, кроме самого большого. выберите максимальное значение из возвращенного списка.
источник
источник
источник
Это самый сложный способ:
источник
источник
Как вы упомянули повторяющиеся значения. В таком случае вы можете использовать DISTINCT и GROUP BY чтобы найти второе по величине значение
Вот таблица
:
Первая часть LIMIT = начальный индекс
Вторая часть LIMIT = сколько стоит
источник
это вернет третье место в таблице emp
источник
not in - это условие, которое исключает наибольшее значение column_name.
Ссылка: интервью с программистом
источник
Что-то вроде этого? Я не проверял это, хотя:
источник
Видеть Как выбрать n-ую строку в таблице базы данных SQL? ,
Sybase SQL Anywhere поддерживает:
источник
Используя коррелированный запрос:
источник
Этот запрос выбирает максимум три зарплаты. Если два emp получают одинаковую зарплату, это не влияет на запрос.
источник
источник
Это работает в MS SQL:
источник