12

簡単に言えば、特にタイムスタンプの列を含むテーブルがあります。最新の(つまり最大値の)タイムスタンプを持つ行を取得したい。現在、私はこれを行っています:

SELECT * FROM table ORDER BY timestamp DESC LIMIT 1

しかし、私はむしろこのようなことをしたいと思います:

SELECT * FROM table WHERE timestamp=max(timestamp)

ただし、SQLiteはこのクエリを拒否します:

SQL error: misuse of aggregate function max()

ドキュメントはこの動作を確認しています(ページの下部):

集計関数は、SELECTステートメントでのみ使用できます。

私の質問は、selectを並べ替えたり、返される行の数を1に制限したりせずに、タイムスタンプが最大の行を取得するクエリを作成することは可能ですか?これは可能であるように思われますが、私のSQL-fuは嗅ぎまわっていないと思います。

4

4 に答える 4

18
SELECT * from foo where timestamp = (select max(timestamp) from foo)

または、SQLiteが副選択をセットとして扱うことを主張する場合、

SELECT * from foo where timestamp in (select max(timestamp) from foo)
于 2008-12-24T01:02:34.640 に答える
4

猫の皮を剥ぐ方法はたくさんあります。

自動インクリメント機能を持つ ID 列がある場合、ID で最後のレコードを返すと、もちろんタイムスタンプ列にインデックスを付けたい場合を除き、列のインデックスにより、クエリが高速になります。

SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1
于 2012-10-18T13:15:41.440 に答える
1

この質問にこの1週間で5回答えたと思いますが、今は疲れすぎてそのうちの1つへのリンクを見つけることができないので、ここにもう一度...

SELECT
     *
FROM
     table T1
LEFT OUTER JOIN table T2 ON
     T2.timestamp > T1.timestamp
WHERE
     T2.timestamp IS NULL

基本的に、それより後の行が一致する行を探しています。

注:コメントで指摘されているように、この方法はこの種の状況ではうまく機能しません。通常、(例として)各顧客の最後の行が必要な状況では(少なくともSQL Serverの場合)より適切に機能します。

于 2008-12-24T01:02:48.070 に答える
1

あなたは簡単に行うことができます

SELECT *, max(タイムスタンプ) FROM テーブル

編集: 集計関数はこのように使用できないため、エラーが発生します。SquareCogが提案たことは、最善のことだったと思います

SELECT * FROM table WHERE timestamp = (select max(timestamp) from table)
于 2010-10-13T10:21:20.353 に答える