Взятие второй последней строки только с одним выбором в SQL Server?
Я пытался выбрать второй последний ряд с SQL Server. Поэтому я написал такой запрос:
SELECT TOP 1 * From Cinema
WHERE CinemaID!=(SELECT TOP 1 CinemaID
FROM Cinema
ORDER BY CinemaID DESC)
ORDER BY CinemaID DESC
и он сделал то, что мне нужно. Но я хочу сделать то же самое только с одним выбором.
Я читал, что предложение LIMIT в MySql делает это. Но я не мог найти никакого эквивалента этого. Поэтому я ценю любую помощь в поиске чего-то полезного.
Ответы
Ответ 1
Чтобы получить вторую последнюю строку в одном выборе:
SELECT TOP 1 * From
(select Top 2 * from Cinema ORDER BY CinemaID DESC) x
ORDER BY CinemaID
Это действительно только "один", потому что внешний выбор занимает всего 2 строки.
Ответ 2
Лучший способ сделать это (и совместимый со стандартом ANSI SQL) - использовать CTE (Common Table Expression) с функцией ROW_NUMBER
:
;WITH OrderedCinemas AS
(
SELECT
CinemaID, CinemaName,
ROW_NUMBER() OVER(ORDER BY CinemaID DESC) AS 'RowNum'
FROM dbo.Cinema
)
SELECT
CinemaID, CinemaName
FROM OrderedCinemas
WHERE RowNum = 2
Используя эту конструкцию, вы можете получить второе наивысшее значение очень легко - или пятую высоту (WHERE RowNum = 5
) или верхние 3 строки (WHERE RowNum <= 3
) или все, что вам нужно - значения CinemaID
просто упорядочены и последовательно пронумерованы для вашего использования.
Ответ 3
Следующие действия не работают, объясняя почему:
Использование столбца производной функции ранжирования в разделе where (SQL Server 2008)
Я буду держать его здесь для полноты:
SELECT row_number() OVER (ORDER BY col) r, *
FROM tbl
WHERE r = 2
Дополнительная информация:
http://www.bidn.com/blogs/marcoadf/bidn-blog/379/ranking-functions-row_number-vs-rank-vs-dense_rank-vs-ntile
Итак, я думаю, что наиболее читаемый способ сделать это:
SELECT * FROM (SELECT row_number() OVER (ORDER BY col) r, * FROM tbl) q
WHERE r = 2
Ответ 4
Поскольку этот (старый) вопрос не был помечен конкретной версией SQL-Server, и ни один из (очень хороших) ответов не использует только одно предложение SELECT
- по уважительной причине, что это было невозможно в старых версиях - вот тот, который работает только в последних 2012+ версиях:
SELECT c.*
FROM dbo.Cinema AS c
ORDER BY CinemaID DESC
OFFSET 1 ROW
FETCH FIRST 1 ROW ONLY ;
Протестировано в SQLFiddle
Ответ 5
SELECT TOP 1 * FROM tbl_CompanyMaster
where Companyid >= (SELECT MAX(Companyid) - 1 FROM tbl_CompanyMaster)
Ответ 6
Итак, в духе только использования одного предложения SELECT, как указано в OP, и тщательного злоупотребления T-SQL в целом, я предлагаю то, что я никогда бы никогда не рекомендовал использовать на производстве, но тем не менее удовлетворяет указанным критериям:
update Cinema
set Cinema.SomeField = Cinema.SomeField
output inserted.*
from Cinema
inner join
(
select top 2 CinemaID, ROW_NUMBER() over (order by CinemaID desc) as RowNum
from Cinema
) rsRowNum on rsRowNum.CinemaID = Cinema.CinemaID
where RowNum = 2
Ответ 7
Этот запрос также будет работать для SQLITE
SELECT * From
(select * from Cinema ORDER BY CinemaID DESC LIMIT 2) AS name
ORDER BY CinemaID LIMIT 1
Ответ 8
Вы используете только один оператор SELECT. Оператор SELECT может включать произвольное (более или менее) количество подзапросов - коррелированные подзапросы, скалярные подзапросы и т.д., Каждый со своим предложением SELECT. Но это еще один оператор SELECT.
Если вы хотите избежать подзапроса, вы можете выбрать верхнюю часть 2 и пропустить тот, который вы не хотите. Тем не менее, такое программирование довольно хрупкое. Вы должны помнить, что пропустить каждый раз; рано или поздно вы забудете.
Ответ 9
Два выбора, но немного быстрее
select top 1 * from(
SELECT TOP 2 * From Cinema
WHERE CinemaID
ORDER BY CinemaID DESC) top2
Order by CinemaID
Ответ 10
SELECT field_name FROM (SELECT TOP 2 field_name FROM table_name
ORDER BY field_name DESC)
WHERE rownum = 2;
Ответ 11
select * from TABLE_NAME order by COLUMN_NAME desc limit 1,1 ;
Где COLUMN_NAME
должен быть "первичный ключ" или "уникальный"
Ответ 12
select top 1* from(SELECT TOP 2 * From Cinema
WHERE CinemaID
ORDER BY CinemaID DESC) XYZ
ORDER BY CinemaID
где XYZ не является ключевым словом. Это просто слово. И слово может быть любым.
Ответ 13
Если вам нужно это сделать, но:
- столбец отличается от
id
- вам нужно заказать определенный столбец
- не может использовать
SELECT
в FROM
(если вы используете старые версии Hibernate, например).
Вы можете сделать:
select top 1 * from Cinema
where date < (select MAX(date) from Cinema)
order by date desc
Ответ 14
Самый простой способ получить вторую последнюю строку из таблицы sql - это пользователь ORDER BY CinemaID DESC и установить LIMIT 1,1
ПОПРОБУЙТЕ ЭТО
SELECT * from `Cinema` ORDER BY `CinemaID` DESC LIMIT 1,1
Ответ 15
Вот мой код:
SELECT * From
(select * from table name ORDER BY column name DESC LIMIT 2) AS xyz
ORDER BY column name LIMIT 1;