web-dev-qa-db-ja.com

ソートせずにテーブルの最後の5行を選択するにはどうすればよいですか?

テーブルを昇順または降順に並べずに、SQL Serverのテーブルから最後の5つのレコードを選択したい。

25
ganesh Verma

これは私がこれまでに書いた中で最も奇妙なクエリとほぼ同じですが、順序付けをせずにテーブルから「最後の5」行を取得することは間違いありません。

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

これは、値を "top"句に渡すSQL Server 2005の機能を利用していることに注意してください-SQL Server 2000では機能しません。

34
Matt Hamilton

Idにインデックスがあるとします。これは非常に高速です。

SELECT * FROM [MyTable] WHERE [id] > (SELECT MAX([id]) - 5 FROM [MyTable])
28
msuvajac
  1. テーブル内の行数をカウントする必要があります(12行あるとしましょう)
  2. 次に、それらから5行を減算します(現在7になっています)
  3. select * where 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
    

    簡単には注文できません。

10
M.M.F

質問の言い回しは、希望する順序でデータを取得するために、テーブル内のデータを物理的に再分類しなければならないと考えるように聞こえます。その場合、これは当てはまりません。この目的のために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
RedFilter

これを使用できる最後のレコードから5つのレコードを検索し、

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

注文がなければ、これは不可能です。 「底」の定義は何ですか?以下は、データベースへの格納方法に応じて5行を選択します。

SELECT TOP 5 * FROM [TableName]

3
Stefan Mai

「最後の5行」は、実際にはクラスター化インデックスに応じて最後の5行です。定義により、クラスター化インデックスは、行の順序付け方法です。したがって、何らかの順序がなければ「最後の5行」を取得することはできません。ただし、クラスター化インデックスに関連する最後の5行を取得できます。

SELECT TOP 5 * FROM MyTable
ORDER BY MyCLusteredIndexColumn1, MyCLusteredIndexColumnq, ..., MyCLusteredIndexColumnN DESC
3
Charles Graham
select * from table limit 5 offset (select count(*) from table) - 5;
3
Rob

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

Mysqlで最後の5行を取得


このクエリは完全に機能しています

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
2
M Palani Mca

合計行数がわかっている場合は、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;
2
idstam

主キーまたは同一の列がない場合は、これを試してください:

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

メモリから取得できます。
最初にDataSetの行を取得し、次にDataSetの最後の5行を取得します。

1
eddy147

一部のデータベースでは、データベースの順序で注文するための便利なトリックがあります。

SELECT * FROM TableName ORDER BY true

どうやら、これはここに投稿された他の提案のいずれかと連携して、結果を「データベースから出た順序」に残すことができます。データベースによっては、最後に変更された順序です。

1
Kent Fredric

テーブルの行数が5未満の場合、Matt Hamiltonとmsuvajacの答えは間違っています。なぜなら、TOP N行カウント値は負ではないかもしれないからです。
優れた例を見つけることができます ここ

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

私はこのコードを使用しています:

select * from tweets where placeID = '$placeID' and id > (
    (select count(*) from tweets where placeID = '$placeID')-2)
1
user3236289
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
Slava

@ Apps Tawale のおかげで、 his answer に基づいて、ここにもう1つの(私の)バージョンがあります。

ID列のない最後の5つのレコードを選択するには、

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

それにもかかわらず、注文はありますが、RowNumでは:)

Note(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

Note(2):ID列がないと、大きなデータの場合、クエリに少し時間がかかります

0
Irf

SQL Serverでは、クエリで順序付けを使用しないと不可能だと思われます。これは私が使用したものです。

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