SQL Server SELECT LAST N строк - PullRequest
       12

SQL Server SELECT LAST N строк

121 голосов
/ 16 ноября 2010

Это известный вопрос, но лучшее решение, которое я нашел, это что-то вроде:

SELECT TOP N *
FROM MyTable
ORDER BY Id DESC

У меня есть таблица с большим количеством строк.Невозможно использовать этот запрос, потому что он занимает много времени.Так как же мне выбрать последние N строк, не используя ORDER BY?

EDIT

Извините, дублированный вопрос о этот

Ответы [ 16 ]

2 голосов
/ 04 марта 2014

Этот запрос возвращает последние N строк в правильном порядке, но его производительность низкая

select *
from (
    select top N *
    from TableName t
    order by t.[Id] desc
) as temp
order by temp.[Id]
1 голос
/ 18 марта 2014

Возможно, это не совсем подходит для вопроса, но…

Предложение OFFSET

Предложение OFFSET number позволяет пропустить количество строк, а затем возвращать строки после этого.

Эта ссылка на документ предназначена для Postgres;Я не знаю, относится ли это к Sybase / MS SQL Server.

0 голосов
/ 07 октября 2017

Метод, который я использую для запроса НАИБОЛЕЕ ПОСЛЕДНИХ строк в очень больших таблицах (100+ миллионов или 1+ миллиардов строк) ограничивает запрос до«чтение» только самый последний «N» процент последних строк.Это приложения реального мира, например, я делаю это для неисторических недавних данных о погоде или недавних поисков в новостной ленте или недавних данных о точках данных о местоположении GPS.

Это значительное улучшение производительности например, если вы точно знаете, что ваши строки находятся в последних 5% ТОП таблицы.Таким образом, даже если в таблицах есть индексы, это дополнительно ограничивает возможности только 5% строк в таблицах, которые содержат более 100 миллионов или более 1 миллиарда строк.Это особенно актуально, когда для старых данных требуется физический диск чтения, а не только логическая память чтения.

Это гораздо более эффективно, чем SELECT TOP |ПРОЦЕНТ |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'
0 голосов
/ 19 октября 2015
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
0 голосов
/ 31 июля 2013

Попробуйте использовать синтаксис EXCEPT.
Примерно так:

   SELECT * 
    FROM   clientDetails 
    EXCEPT 
    (SELECT TOP (numbers of rows - how many rows you want) * 
     FROM   clientDetails) 
0 голосов
/ 28 сентября 2012

Для отображения последних 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) 
...