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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

  • Вам нужно подсчитать количество строк внутри таблицы (скажем, у нас есть 12 строк)
  • то вычтите из них 5 строк (теперь мы в 7)
  • выберите *, где 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

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

Ответ 5

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

SELECT *
FROM   Table Name
WHERE  ID <= IDENT_CURRENT('Table Name')
AND ID >= IDENT_CURRENT('Table Name') - 5

Ответ 6

Без заказа это невозможно. Что определяет "дно"? Ниже выберем 5 строк в соответствии с тем, как они хранятся в базе данных.

SELECT TOP 5 * FROM [TableName]

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

Ответ 13

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

SELECT * FROM TableName ORDER BY true

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

Ответ 14

select * 
from table 
order by empno(primary key) desc 
fetch first 5 rows only

Ответ 15

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

Ответ 16

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

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

Ответ 17

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

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

Ответ 18

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

Ответ 19

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

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

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

Тем не менее, у него есть заказ на, но на RowNum :)

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

Таким образом, чтобы поддерживать порядок, мы можем слегка пойти так:

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

Ответ 20

Насколько я понимаю, если вы хотите получить строки, которых нет в топ-10, а не в топ-20, вы можете использовать, кроме предложения.

select * from <tbl_name> except select top (10) * from <tbl_name>

select * from <tbl_name> where <condition> except select top (10) * from <tbl_name> where <condition>

Ответ 21

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

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