* 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 ONLYORDER 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 ) 

コメント

  • 正しいようですが、少し複雑すぎます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です