Я хочу выбрать последние 5 записей из таблицы в SQL Server без упорядочения таблицы в порядке возрастания или убывания.
Как выбрать последние 5 строк в таблице без сортировки?
Ответ 1
Это почти самый причудливый запрос, который я когда-либо писал, но я уверен, что он получает строки "последние 5" из таблицы без упорядочения:
select *
from issues
where issueid not in (
select top (
(select count(*) from issues) - 5
) issueid
from issues
)
Обратите внимание, что это использует способность SQL Server 2005 передать значение в предложение "сверху" - он не работает на SQL Server 2000.
Ответ 2
Предположим, что у вас есть указатель на id, это будет молниеносно:
SELECT * FROM [MyTable] WHERE [id] > (SELECT MAX([id]) - 5 FROM [MyTable])
Ответ 3
- Вам нужно подсчитать количество строк внутри таблицы (скажем, у нас есть 12 строк)
- то вычтите из них 5 строк (теперь мы в 7)
-
выберите *, где index_column > 7
select * from users where user_id > ( (select COUNT(*) from users) - 5)
вы можете заказать их ASC или DESC
Но при использовании этого кода
select TOP 5 from users order by user_id DESC
он не будет упорядочен легко.
Ответ 4
То, как формулируется ваш вопрос, звучит так, будто вы считаете, что вам нужно физически прибегать к данным в таблице, чтобы вернуть их в том порядке, в котором вы хотите. Если это так, это не так, для этой цели существует предложение ORDER BY. Физический порядок, в котором хранятся записи, остается неизменным при использовании ORDER BY. Записи сортируются в памяти (или на временном диске) до их возврата.
Обратите внимание, что порядок возврата записей не гарантируется без использования предложения ORDER BY. Таким образом, хотя любое из предложений здесь может работать, нет оснований думать, что они будут продолжать работать, и вы не сможете доказать, что они работают во всех случаях с вашей текущей базой данных. Это по дизайну - я предполагаю, что он должен предоставить движку базы данных свободу делать то же самое, что и записи, чтобы получить максимальную производительность в случае, когда явно не указан явный порядок.
Предполагая, что вам нужны последние 5 записей, отсортированные по полю Name в порядке возрастания, вы можете сделать что-то вроде этого, которое должно работать либо в SQL 2000, либо в 2005 году:
select Name
from (
select top 5 Name
from MyTable
order by Name desc
) a
order by Name asc
Ответ 5
Найдите 5 записей из последних записей, которые вы можете использовать,
SELECT *
FROM Table Name
WHERE ID <= IDENT_CURRENT('Table Name')
AND ID >= IDENT_CURRENT('Table Name') - 5
Ответ 6
Без заказа это невозможно. Что определяет "дно"? Ниже выберем 5 строк в соответствии с тем, как они хранятся в базе данных.
SELECT TOP 5 * FROM [TableName]
Ответ 7
Ну, "последние пять строк" на самом деле являются последними пятью строками в зависимости от вашего кластерного индекса. Ваш кластеризованный индекс, по определению, является способом упорядочения его строк. Таким образом, вы действительно не можете получить "последние пять строк" без какого-либо заказа. Тем не менее, вы можете получить последние пять строк, относящихся к кластерному индексу.
SELECT TOP 5 * FROM MyTable
ORDER BY MyCLusteredIndexColumn1, MyCLusteredIndexColumnq, ..., MyCLusteredIndexColumnN DESC
Ответ 8
Если вы знаете, сколько строк будет в общей сложности, вы можете использовать функцию ROW_NUMBER(). Здесь пример из MSDN (http://msdn.microsoft.com/en-us/library/ms186734.aspx)
USE AdventureWorks;
GO
WITH OrderedOrders AS
(
SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
FROM Sales.SalesOrderHeader
)
SELECT *
FROM OrderedOrders
WHERE RowNumber BETWEEN 50 AND 60;
Ответ 9
select * from table limit 5 offset (select count(*) from table) - 5;
Ответ 10
Последние 5 строк в mysql
Этот запрос отлично работает
SELECT * FROM (SELECT * FROM recharge ORDER BY sno DESC LIMIT 5)sub ORDER BY sno ASC
или
select sno from(select sno from recharge order by sno desc limit 5) as t where t.sno order by t.sno asc
Ответ 11
В SQL Server 2012 вы можете сделать это:
Declare @Count1 int ;
Select @Count1 = Count(*)
FROM [Log] AS L
SELECT
*
FROM [Log] AS L
ORDER BY L.id
OFFSET @Count - 5 ROWS
FETCH NEXT 5 ROWS ONLY;
Ответ 12
Вы можете получить их из памяти.
Итак, сначала вы получите строки в DataSet, а затем получите последние 5 из DataSet.
Ответ 13
Существует удобный трюк, который работает в некоторых базах данных для упорядочения в порядке базы данных,
SELECT * FROM TableName ORDER BY true
По-видимому, это может работать вместе с любыми другими предложениями, размещенными здесь, чтобы оставить результаты в порядке "порядок выхода из базы данных", который в некоторых базах данных является порядком их последнего изменения.
Ответ 14
select *
from table
order by empno(primary key) desc
fetch first 5 rows only
Ответ 15
Когда число строк в таблице меньше 5, ответы Мэтта Гамильтона и мсуваджака неверны.
Поскольку значение TOP N rowcount не может быть отрицательным.
Большой пример можно найти здесь.
Ответ 16
Я использую этот код:
select * from tweets where placeID = '$placeID' and id > (
(select count(*) from tweets where placeID = '$placeID')-2)
Ответ 17
Попробуйте это, если у вас нет первичного ключа или идентичного столбца:
select [Stu_Id],[Student_Name] ,[City] ,[Registered],
RowNum = row_number() OVER (ORDER BY (SELECT 0))
from student
ORDER BY RowNum desc
Ответ 18
DECLARE @MYVAR NVARCHAR(100)
DECLARE @step int
SET @step = 0;
DECLARE MYTESTCURSOR CURSOR
DYNAMIC
FOR
SELECT col FROM [dbo].[table]
OPEN MYTESTCURSOR
FETCH LAST FROM MYTESTCURSOR INTO @MYVAR
print @MYVAR;
WHILE @step < 10
BEGIN
FETCH PRIOR FROM MYTESTCURSOR INTO @MYVAR
print @MYVAR;
SET @step = @step + 1;
END
CLOSE MYTESTCURSOR
DEALLOCATE MYTESTCURSOR
Ответ 19
Благодаря @Apps Tawale, на основании его ответа, здесь немного другой (моей) версии,
Чтобы выбрать последние 5 записей без идентификационной колонки,
select top 5 *,
RowNum = row_number() OVER (ORDER BY (SELECT 0))
from [dbo].[ViewEmployeeMaster]
ORDER BY RowNum desc
Тем не менее, у него есть заказ на, но на RowNum :)
Примечание (1): Приведенный выше запрос обратит порядок, который мы получаем при выполнении основного запроса select.
Таким образом, чтобы поддерживать порядок, мы можем слегка пойти так:
select *, RowNum2 = row_number() OVER (ORDER BY (SELECT 0))
from (
select top 5 *, RowNum = row_number() OVER (ORDER BY (SELECT 0))
from [dbo].[ViewEmployeeMaster]
ORDER BY RowNum desc
) as t1
order by RowNum2 desc
Примечание (2): без столбца идентификаторов запрос занимает немного времени в случае больших данных
Ответ 20
Насколько я понимаю, если вы хотите получить строки, которых нет в топ-10, а не в топ-20, вы можете использовать, кроме предложения.
select * from <tbl_name> except select top (10) * from <tbl_name>
select * from <tbl_name> where <condition> except select top (10) * from <tbl_name> where <condition>
Ответ 21
Получить счет этой таблицы
select count(*) from TABLE
select top count * from TABLE where 'primary key row' NOT IN (select top (count-5) 'primary key row' from TABLE)