* edit:SQL Server2012を使用しています。
次のようなテーブル:
id LogOutTime ------------------------------ 8563 2017-11-21 09:21:28.330 7961 2017-11-21 09:22:40.627 7961 2017-11-21 09:26:48.507 8563 2017-11-21 09:29:05.977
各IDの最新のLogOutTimeを取得したい。次に、そのグループから最も古いLogOutTimeを取得したい。 。
これは私が欲しいレコードです:
id LogOutTime ------------------------------ 7961 2017-11-21 09:26:48.507
これにより、各グループの最新のLogOutTimeがわかります:
SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id
これで希望の日付が表示されます:
SELECT MIN(table2.MaxLogout) FROM (SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id) AS table2
IDと私を取得する必要があります ” mどうすればよいかわからず、私のような例が見つかりませんでした。
コメント
- クエリの対象となるDBMSはどれですか?
- コードを編集しました。間違ったフィールド名を残しました。GROUPBYIDである必要があります。ありがとうございます。
回答
これは、派生テーブルを使用すると非常に簡単です。
CREATE TABLE #thing (id INT, dateval DATETIME) INSERT #thing ( id, dateval ) VALUES (8563, "2017-11-21 09:21:28.330"), (7961, "2017-11-21 09:22:40.627"), (7961, "2017-11-21 09:26:48.507"), (8563, "2017-11-21 09:29:05.977")
必要なのは最小値だけなので、グループ化クエリから上位1つを選択し、日付の昇順で並べ替えることができます。
SELECT TOP 1 * FROM ( SELECT t.id, MAX(t.dateval) AS max_date FROM #thing AS t GROUP BY t.id ) AS x ORDER BY x.max_date;
SQL Serverを特に使用していない場合は、 OFFSET / FETCHを使用します(ただし、これはSQL Server 2012以降で機能します)。
SELECT * FROM ( SELECT t.id, MAX(t.dateval) AS max_date FROM #thing AS t GROUP BY t.id ) AS x ORDER BY x.max_date OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY;
これがお役に立てば幸いです!
回答
DBMSに応じて、LIMIT 1
またはTOP 1
またはFETCH FIRST 1 ROWS ONLY
–ORDER BY MaxLogOut
との組み合わせ:
-- standard SQL, Postgres, SQL Server 2012+ SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id ORDER BY MaxLogOut OFFSET 0 ROWS FETCH FIRST 1 ROWS ONLY ; -- SQL Server SELECT TOP (1) MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id ORDER BY MaxLogOut ; -- MySQL SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id ORDER BY MaxLogOut LIMIT 1 ;
回答
すべての回答に感謝します。これが私が解決策として思いついたものです。
SELECT * FROM ( SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id ) AS table2 WHERE MaxLogOut = (SELECT MIN(MaxLogOut) FROM ( SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id) AS table3 )
コメント
- 正しいようですが、少し複雑すぎます。