SQL Server выберите последние N строк
Это известный вопрос, но лучшее решение, которое я нашел, это что-то вроде:
SELECT TOP N *
FROM MyTable
ORDER BY Id DESC
У меня есть таблица с большим количеством строк. Это не возможность использовать этот запрос, потому что это занимает много времени. Итак, как я могу выбрать последние n строк без использования ORDER BY?
EDIT
извините дублированный вопрос этого
15 ответов:
вы можете сделать это с помощью функции номер строки по разделу также. Отличный пример можно найти здесь:
Я использую таблицу Orders базы данных Northwind... Теперь давайте получим последние 5 заказов, размещенных сотрудником 5:
SELECT ORDERID, CUSTOMERID, OrderDate FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY EmployeeID ORDER BY OrderDate DESC) AS OrderedDate,* FROM Orders ) as ordlist WHERE ordlist.EmployeeID = 5 AND ordlist.OrderedDate <= 5
вы можете сделать SQL server, чтобы выбрать последние n строк с помощью этого SQL:
select * from tbl_name order by id desc limit N;
Я проверил код JonVD, но обнаружил, что это было очень медленно, 6s.
этот код занял 0s.
SELECT TOP(5) ORDERID, CUSTOMERID, OrderDate FROM Orders where EmployeeID=5 Order By OrderDate DESC
если вы хотите выбрать последние цифры номера строк из таблицы.
синтаксис будет как
select * from table_name except select top (numbers of rows - how many rows you want)* from table_nameэти утверждения работают, но по-разному. спасибо, ребята.
select * from Products except select top (77-10) * from Productsтаким образом, вы можете получить последние 10 строк, но порядок покажет descnding way
select top 10 * from products order by productId desc
select * from products where productid in (select top 10 productID from products) order by productID desc
select * from products where productID not in (select top((select COUNT(*) from products ) -10 )productID from products)
индексируется ли "Id"? Если нет, то это важная вещь (я подозреваю, что она уже индексируется).
кроме того, вам нужно вернуть все столбцы? Вы можете получить существенное улучшение скорости, если вам действительно нужно только меньшее подмножество столбцов, которое может быть полностью удовлетворено индексом в столбце ID - например, если у вас есть некластеризованный индекс в столбце Id, без каких-либо других полей, включенных в индекс, тогда ему нужно будет выполнить поиск по кластеризованному индексу, чтобы на самом деле получить остальные столбцы, чтобы вернуться, и это может составлять большую часть стоимости запроса. Если это кластеризованный индекс или некластеризованный индекс, который включает все остальные поля, которые вы хотите вернуть в запросе, то вы должны быть в порядке.
сначала вы больше всего получаете количество записей от
Declare @TableRowsCount Int select @TableRowsCount= COUNT(*) from <Your_Table>и затем :
В SQL Server 2012
SELECT * FROM <Your_Table> As L ORDER BY L.<your Field> OFFSET <@TableRowsCount-@N> ROWS FETCH NEXT @N ROWS ONLY;В SQL Server 2008
SELECT * FROM ( SELECT ROW_NUMBER() OVER(ORDER BY ID) AS sequencenumber, * FROM <Your_Table> Order By <your Field> ) AS TempTable WHERE sequencenumber > @TableRowsCount-@N
в очень общем виде и для поддержки SQL server здесь
SELECT TOP(N) * FROM tbl_name ORDER BY tbl_id DESCи для производительности это неплохо (менее одной секунды для более чем 10 000 записей на серверной машине)
вот что вы можете попробовать без
order byно я думаю, что это требует, чтобы каждая строка уникальна.Nколичество строк, которые вы хотите,L- количество строк в таблице.select * from tbl_name except select top L-N * from tbl_nameкак отмечалось ранее, какие строки возвращается неопределено.
EDIT: это на самом деле собака медленно. На самом деле никакой ценности.
этот запрос возвращает последние n строк в правильном порядке, но это плохо
select * from ( select top N * from TableName t order by t.[Id] desc ) as temp order by temp.[Id]
это может быть не совсем правильно подходит к вопросу, но...
офсетное предложение
на
OFFSET numberпредложение позволяет пропустить строк, а затем возвращает строки после этого.эта ссылка doc относится к Postgres; я не знаю, относится ли это к Sybase/MS SQL Server.
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
метод, который я использую для запроса САМЫЕ ПОСЛЕДНИЕ строки в очень больших таблицах (100 + миллионов или 1 + миллиардов строк) ограничивает запрос " чтением "только самого последнего" N " процента последних строк. Это приложения реального мира, например, я делаю это для неисторических последних данных о погоде или последних поисков в ленте новостей или последних данных о местоположении GPS.
Это огромное улучшение производительности Если вы знаете например, убедитесь, что ваши строки находятся в самых последних верхних 5% таблицы. Таким образом, даже если есть индексы в таблицах, это дополнительно ограничивает возможности только 5% строк в таблицах, которые имеют 100+ миллионов или 1+ миллиардов строк. Особенно это касается тех случаев, когда более старые данные потребуют Физический Диск читает и не только Логический В Памяти читает.
Это намного эффективнее, чем выбрать TOP / PERCENT / LIMIT, поскольку он не выбирает строки, но просто ограничьте часть данных для поиска.
DECLARE @RowIdTableA BIGINT DECLARE @RowIdTableB BIGINT DECLARE @TopPercent FLOAT -- Given that there is an Sequential Identity Column -- Limit query to only rows in the most recent TOP 5% of rows SET @TopPercent = .05 SELECT @RowIdTableA = (MAX(TableAId) - (MAX(TableAId) * @TopPercent)) FROM TableA SELECT @RowIdTableB = (MAX(TableBId) - (MAX(TableBId) * @TopPercent)) FROM TableB SELECT * FROM TableA a INNER JOIN TableB b ON a.KeyId = b.KeyId WHERE a.Id > @RowIdTableA AND b.Id > @RowIdTableB AND a.SomeOtherCriteria = 'Whatever'
для отображения последних 3 строк, без использования
order by:select * from Lms_Books_Details where Book_Code not in (select top((select COUNT(*) from Lms_Books_Details ) -3 ) book_code from Lms_Books_Details)
попробуйте использовать
EXCEPTсинтаксис.
Что-то вроде этого:SELECT * FROM clientDetails EXCEPT (SELECT TOP (numbers of rows - how many rows you want) * FROM clientDetails)
Comments