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

SQL Server SELECT LAST N строк

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

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

SELECT TOP N *
FROM MyTable
ORDER BY Id DESC

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

EDIT

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

Ответы [ 16 ]

83 голосов
/ 15 марта 2013

Вы можете заставить сервер SQL выбирать последние N строк, используя этот SQL:

select * from tbl_name order by id desc limit N;
43 голосов
/ 16 ноября 2010

Я тестировал код JonVD, но обнаружил, что он очень медленный, 6 с.

Этот код занял 0 с.

SELECT TOP(5) ORDERID, CUSTOMERID, OrderDate    
FROM Orders where EmployeeID=5    
Order By OrderDate DESC
34 голосов
/ 16 ноября 2010

Вы также можете сделать это, используя функцию ROW NUMBER BY PARTITION. Отличный пример можно найти здесь :

Я использую таблицу «Заказы» базы данных «Борей» ... Теперь давайте возьмем последние 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
15 голосов
/ 25 апреля 2013

Если вы хотите выбрать последние номера строк в таблице.

Синтаксис будет похож на

 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 строк, но порядок будет показывать по убыванию

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)
6 голосов
/ 28 мая 2016

В общих чертах и ​​для поддержки SQL-сервера здесь есть

SELECT TOP(N) *
FROM tbl_name
ORDER BY tbl_id DESC

и для производительности это неплохо (менее одной секунды для более чем 10000 записей на сервере)

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

Индексируется ли "Id"? Если нет, то это важная вещь (я подозреваю, что она уже проиндексирована).

Кроме того, вам нужно вернуть все столбцы? Вы можете получить существенное улучшение в скорости, если вам действительно нужно только меньшее подмножество столбцов, которое можно ПОЛНОСТЬЮ удовлетворить с помощью индекса в столбце ID - например, если у вас есть индекс NONCLUSTERED для столбца Id, а другие поля не включены в индекс, то придется выполнить поиск по кластерному индексу, чтобы фактически получить остальные столбцы для возврата, и это может составить много стоимости запроса. Если это индекс CLUSTERED или индекс NONCLUSTERED, который включает в себя все другие поля, которые вы хотите вернуть в запросе, то все будет в порядке.

5 голосов
/ 25 сентября 2013

Сначала вы получите наибольшее количество записей из

 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 
4 голосов
/ 21 июня 2013
select * from (select top 6 * from vwTable order by Hours desc) T order by Hours
4 голосов
/ 17 апреля 2013

Вот что вы можете попробовать без order by, но я думаю, что это требует, чтобы каждый ряд был уникальным. N - это количество строк, которое вы хотите, L - это количество строк в таблице.

select * from tbl_name except select top L-N * from tbl_name

Как отмечалось ранее, какие строки возвращаются, не определено.

РЕДАКТИРОВАТЬ: это на самом деле собака медленно. Не имеет значения на самом деле.

2 голосов
/ 26 февраля 2019

используйте desc с orderby в конце запроса, чтобы получить последние значения.

...