Как выбрать последние 5 строк в таблице без сортировки?

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

@Ganesh - вы должны сформулировать свой вопрос как реальный вопрос, а не как утверждение «Мне нужна помощь».

paxdiablo 22.11.2008 11:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
28
1
193 967
22

Ответы 22

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

SELECT TOP 5 * FROM [TableName]

Правильно, также вы можете добавить «порядок по colx desc» в нижнюю пятерку в зависимости от индексов. т.е. верхние 5 ЯВЛЯЮТСЯ нижние 5, если вы измените порядок.

Booji Boy 22.11.2008 19:27

Это не так. Этот запрос выберет 5 строк но не всегда) в соответствии с тем, как они хранятся в базе данных.

ypercubeᵀᴹ 28.09.2012 10:21

Вы можете извлечь их из памяти. Итак, сначала вы получаете строки в DataSet, а затем последние 5 строк из DataSet.

Это чуть ли не самый причудливый запрос, который я когда-либо писал, но я почти уверен, что он получает «последние 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.

Если под последним вы имеете в виду порядок кластеризованного ключа, то я боюсь, что не работает

Mitch Wheat 22.11.2008 11:20

Я протестировал это на таблице, не имеющей кластеризованного индекса, и он вернул последние пять строк, которые я получаю, выполняя простой «выбор * из проблем».

Matt Hamilton 22.11.2008 11:21

И просто попробовал это на таблице с первичным ключом "identity int", и там он тоже сработал. Достали мне "последние пять" рядов.

Matt Hamilton 22.11.2008 11:22

В ПОРЯДКЕ. Я тестировал таблицу с кластеризованным индексом.

Mitch Wheat 22.11.2008 11:22

без заказа это не работает. период. вы можете попасть в ситуацию, когда один запрос опирается на результаты другого запроса, и результаты могут быть совершенно разными.

Mladen Prajdic 23.11.2008 20:09

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

SELECT TOP 5 * FROM MyTable
ORDER BY MyCLusteredIndexColumn1, MyCLusteredIndexColumnq, ..., MyCLusteredIndexColumnN DESC

Есть удобный трюк, который работает в некоторых базах данных для упорядочивания в порядке базы данных,

SELECT * FROM TableName ORDER BY true

По-видимому, это может работать в сочетании с любыми другими предложениями, размещенными здесь, чтобы оставить результаты в порядке их выхода из базы данных, который в некоторых базах данных является порядком их последнего изменения.

Формулировка вашего вопроса создает впечатление, будто вы думаете, что вам нужно физически преобразовать данные в таблице, чтобы вернуть их в том порядке, в котором вы хотите. Если это так, то это не так, для этой цели существует предложение 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

Этот ответ должен быть отмечен как правильный (и наиболее совместимый).

AshesToAshes 11.05.2016 19:08

Данные в таблицах не всегда находятся в организованном формате ... идея заключается в том, что делать, если мы хотим узнать последнюю запись в такой базе данных

snigdha 26.03.2020 15:21

@snigdha Ответ, приведенный выше, пытается сказать вам, что понятие "последний" не существует в SQL без ORDER BY.

D'Arcy Rittich 26.03.2020 19:35

Если вы знаете, сколько всего будет строк, вы можете использовать функцию 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;

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

SELECT * FROM [MyTable] WHERE [id] > (SELECT MAX([id]) - 5 FROM [MyTable])

Это безопасно, только если вы не удалили никаких записей. т.е. если ваш максимальный идентификатор = 100, но вы удалили запись 99, вы получите только 4 записи, а не 5.

Amber 18.12.2015 03:24
select * 
from table 
order by empno(primary key) desc 
fetch first 5 rows only

Как написано, выбирает все строки в порядке убывания, а не только первые 5.

JYelton 16.04.2010 21:30

@JYelton - Нет, это не так. Действителен только в SQL Server 2012 и игнорирует требование «без сортировки».

Martin Smith 17.04.2012 15:44
  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
    

    его будет нелегко заказать.

Получите счет в этой таблице

select count(*) from TABLE
select top count * from TABLE where 'primary key row' NOT IN (select top (count-5) 'primary key row' from TABLE)
select * from table limit 5 offset (select count(*) from table) - 5;

Последние 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

В 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;

Когда количество строк в таблице меньше 5, ответы Мэтта Гамильтона и msuvajac неверны. Поскольку значение TOP N rowcount не может быть отрицательным. Отличный пример можно найти Здесь.

я использую этот код:

select * from tweets where placeID = '$placeID' and id > (
    (select count(*) from tweets where placeID = '$placeID')-2)

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

SELECT *
FROM   Table Name
WHERE  ID <= IDENT_CURRENT('Table Name')
AND ID >= IDENT_CURRENT('Table Name') - 5
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

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

select [Stu_Id],[Student_Name] ,[City] ,[Registered], 
       RowNum = row_number() OVER (ORDER BY (SELECT 0))    
from student
ORDER BY RowNum desc 

Спасибо, если у нас есть identity_column, это было бы несложно .. Но у меня был View .. Так что это то, что я искал ..!

Irfan 14.06.2018 10:49

добавлена ​​версия слегка изменен

Irfan 14.06.2018 12:14

Благодаря @Apps Tawale, на основе его ответ, вот немного другой (моей) версии,

Чтобы выбрать последние 5 записей без столбца идентификаторов,

select top 5 *, 
   RowNum = row_number() OVER (ORDER BY (SELECT 0))    
from  [dbo].[ViewEmployeeMaster]
ORDER BY RowNum desc

Тем не менее, в нем есть заказ по, но на RowNum :)

Примечание (1): приведенный выше запрос изменит порядок того, что мы получаем, когда запускаем основной запрос выбора.

Итак, чтобы поддерживать порядок, мы можем немного пойти примерно так:

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): Без столбца идентификаторов запрос занимает немного времени в случае больших данных

В SQL Server это невозможно без упорядочивания в запросе. Это то, что я использовал.

SELECT *
FROM
(
    SELECT TOP 5 *
    FROM [MyTable]
    ORDER BY Id DESC /*Primary Key*/
) AS T
ORDER BY T.Id ASC; /*Primary Key*/

Если вы не хотите располагать таблицу в порядке возрастания или убывания. Использовать это.

select * from table limit 5 offset (select count(*) from table) - 5;

Другие вопросы по теме