Как выбрать последние 5 строк в таблице без сортировки? - PullRequest
24 голосов
/ 22 ноября 2008

Я хочу выбрать последние 5 записей из таблицы в SQL Server без упорядочения таблицы в порядке возрастания или убывания.

Ответы [ 21 ]

34 голосов
/ 22 ноября 2008

Это почти самый странный запрос, который я когда-либо писал, но я почти уверен, что он получает "последние 5" строк из таблицы без упорядочения:

select * 
from issues
where issueid not in (
    select top (
        (select count(*) from issues) - 5
    ) issueid
    from issues
)

Обратите внимание, что здесь используется способность SQL Server 2005 передавать значение в предложение "top" - оно не работает в SQL Server 2000.

28 голосов
/ 19 марта 2009

Предположим, у вас есть индекс по id, это будет молниеносно:

SELECT * FROM [MyTable] WHERE [id] > (SELECT MAX([id]) - 5 FROM [MyTable])
10 голосов
/ 23 ноября 2008

То, как сформулирован ваш вопрос, звучит так, как будто вы думаете, что вам нужно физически прибегнуть к данным в таблице, чтобы вернуть их в нужном вам порядке. Если это так, это не так, для этого существует предложение 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
10 голосов
/ 14 октября 2010
  1. Вам нужно посчитать количество строк внутри таблицы (скажем, у нас 12 строк)
  2. затем вычтите из них 5 строк (сейчас у нас 7)
  3. выберите * где 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 голосов
/ 27 февраля 2015

Поиск 5 записей из последних записей вы можете использовать это,

SELECT *
FROM   Table Name
WHERE  ID <= IDENT_CURRENT('Table Name')
AND ID >= IDENT_CURRENT('Table Name') - 5
3 голосов
/ 22 ноября 2008

Ну, «последние пять строк» ​​на самом деле последние пять строк в зависимости от вашего кластеризованного индекса. Ваш кластеризованный индекс по определению является способом упорядочения строк. Таким образом, вы действительно не можете получить «последние пять рядов» без какого-либо порядка. Однако вы можете получить последние пять строк, так как они относятся к кластерному индексу.

SELECT TOP 5 * FROM MyTable
ORDER BY MyCLusteredIndexColumn1, MyCLusteredIndexColumnq, ..., MyCLusteredIndexColumnN DESC
3 голосов
/ 22 ноября 2008

Без заказа это невозможно. Что определяет «дно»? Следующее выберет 5 строк в соответствии с тем, как они хранятся в базе данных.

SELECT TOP 5 * FROM [TableName]

3 голосов
/ 25 июля 2013
select * from table limit 5 offset (select count(*) from table) - 5;
2 голосов
/ 05 апреля 2016

Попробуйте, если у вас нет первичного ключа или идентичного столбца:

select [Stu_Id],[Student_Name] ,[City] ,[Registered], 
       RowNum = row_number() OVER (ORDER BY (SELECT 0))    
from student
ORDER BY RowNum desc 
2 голосов
/ 16 сентября 2013

В 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...