SQLServerで最後の行を読み取る方法


88

SQL Serverで最後の行を読み取る最も効率的な方法は何ですか?

テーブルは一意のキーでインデックス付けされます。「下の」キー値は最後の行を表します。

回答:


180

MS SQLを使用している場合は、次のことを試すことができます。

SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC 

17
DBに500万件のレコードがある場合はどうなりますか?:-\
2015

4
テーブルがソート列でインデックス付けされている場合、SQLはテーブルの最後の行を読み取るだけです。高価な並べ替えや全表スキャンは必要ありません。
スパイボニアス2018

最後の1000レコードを取得する必要がある場合、どのように取得するかを教えてください
Sri

1
@Sri実行SELECT TOP 1000 * FROM table_name ORDER BY column_name DESCし、最後の1000レコードを出力する必要があります。
ロッドアルグメド


18

自動入力の主キーや日時列(できれば主キー)など、テーブル内に一意に識別する何らかの列が必要になります。次に、これを行うことができます:

SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1

ORDER BY columnその列のデータに基づいて結果をrearangeするように指示し、DESCその結果(従って最初の最後のものを置く)を逆にすることを指示します。その後、LIMIT 11行だけを返すように指示します。


6
MSSQLはLIMITを使用しません
Vinko Vrsalovic 2008年

4
うわー、厳しい、元の質問はSQLServerを具体的に言っていませんでした。上記のソリューションは、SQL Serverが同じ概念を説明するために異なる単語を使用している場合でも、完全に正当です。+1
Greg Hewgill

11

あなたのIDのいくつかが正常である場合、私はあなたのデータベースに何らかの順序があると想定しています

SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)


4

以下のクエリは、並べ替え可能な列がなくても最大のパフォーマンスを発揮するSQLServerで機能すると思います

SELECT * FROM table 
WHERE ID not in (SELECT TOP (SELECT COUNT(1)-1 
                             FROM table) 
                        ID 
                 FROM table)

あなたがそれを理解したことを願っています... :)


これは、DESCを並べ替えることができず、返される最後の行だけが必要な場合に最適なソリューションです。
jjthebig1

3

SQlサーバー2008のSQLクエリでlastを使用しようとしましたが、次のエラーが発生します。「 'last'は認識された組み込み関数名ではありません。」

だから私は使用することになった:

select max(WorkflowStateStatusId) from WorkflowStateStatus 

最後の行のIDを取得します。使用することもできます

Declare @i int
set @i=1
select WorkflowStateStatusId from Workflow.WorkflowStateStatus
 where WorkflowStateStatusId not in (select top (
   (select count(*) from Workflow.WorkflowStateStatus) - @i ) WorkflowStateStatusId from .WorkflowStateStatus)


2

これを試して

SELECT id from comission_fees ORDER BY id DESC LIMIT 1

1
@Vinko Vrsalovicによる上記のコメントとして、MSSQLはを使用しないと述べていますLIMIT。このリターンIncorrect syntax near LIMIT
frmbelz

1

MS SQLデータベース2005のテーブルの最後の行を取得するには、次のクエリを使用できます。

select top 1 column_name from table_name order by column_name desc; 

注: MS SQLデータベース2005のテーブルの最初の行を取得するには、次のクエリを使用できます。

select top 1 column_name from table_name; 

2
select top 1注文なしでは、最初のレコードを取得するための信頼できる方法ではありません。で注文しない場合は、SQLに許可を与えて、必要なレコードを提供します。
コードマジシャン

1

OFFSETおよびFETCH NEXTは、結果を表示しながらSQLページングを実現するSQL Server2012の機能です。

OFFSET引数は、結果からの戻り行に開始行を決定するために使用され、FETCH引き数は、行の数のセットを返すために使用されます。

SELECT *
FROM table_name
ORDER BY unique_column desc
OFFSET 0 Row
FETCH NEXT 1 ROW ONLY

0
SELECT * from Employees where [Employee ID] = ALL (SELECT MAX([Employee ID]) from Employees)

1
同様に、ベストアンサーは、[従業員ID] = ALL(SELECT MIN([従業員ID])from Employees)
manas 2011

0

これは、最後のレコードを取得し、AccessDBのフィールドを更新する方法です。

更新 compalints SET tkt = addzone &'-'& customer_code &'-'& sn where sn in (select max(sn) from compalints )


0

順序付けられた列がない場合は、各行の物理IDを使用できます。

SELECT top 1 sys.fn_PhysLocFormatter(%%physloc%%) AS [File:Page:Slot], 
              T.*
FROM MyTable As T
order by sys.fn_PhysLocFormatter(%%physloc%%) DESC

0

レプリケートされたテーブルがある場合は、localDatabaseにIdentity = 1000、clientDatabaseにIdentity = 2000を設定できます。したがって、最後のIDを取得すると、現在接続されているデータベースの最後ではなく、常にクライアントの最後のIDを見つけることができます。したがって、最後に接続されたデータベースを返す最良の方法は次のとおりです。

SELECT IDENT_CURRENT('tablename')

0

テーブルの「最後の値」を取得していません。金融商品ごとの最後の値を取得しています。それは同じではありませんが、「今どのように行われているのか」を調べようとしている人にとっては関係があると思います。また、RowNumber()とCTEを使用し、その前に1を取り、[column] descで並べ替えました。しかし、私たちはもはやする必要はありません...

私はSQLServer 2017を使用しており、世界中のすべての取引所ですべてのティックを記録しています。1日あたり最大120億ティックがあり、ティックのボリュームと属性(ビッド、アスク、トレード)を含む各ビッド、アスク、トレードを保存しています。 )指定された取引所のいずれか。

そのテーブルには、任意の契約(主に統計)の253種類のティックデータがあり、最後に取引された価格はティックタイプ= 4であるため、使用する価格の「最後」を取得する必要がある場合は、次のようになります。

select distinct T.contractId,
LAST_VALUE(t.Price)over(partition by t.ContractId order by created ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
from [dbo].[Tick] as T
where T.TickType=4

非常に効率的に実行され、ExchangeインポートETLがデータをテーブルにポンプしている間、4秒で実行される私の開発システムの実行プランを見ることができます。ロックが発生すると、速度が低下します...これがライブシステムの動作方法です。 85,697,659行に対する実行プラン


-1
SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)

サイトへようこそ。これはコメントである可能性があります(担当者がいる場合)。問題の解決方法を説明し、前述の10の回答と区別するために、テキストを追加して拡張していただけませんか。
ガン-モニカを復活させる2014年

-5

私はそれが次のようになっていると確信しています。

SELECT last(column_name) FROM table

私は似たようなものを使っているので:

SELECT last(id) FROM Status

7
最後の()は、SQLサーバーの機能ではありません
タリン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.