【SQL】WHERE句で絞ったレコードの中から最新のレコードのみを1件取得する方法
⭐️はじめに
最新の情報を持ったレコードを1件だけ取得したい時、WHERE句やORDER BY句だけでは複数件取得されてしまうことがあります。レコードを絞った後に一番上に来たレコードのみを1件取得する方法をご紹介します。
⭐️取得するサンプルのテーブル
ユーザーの購入履歴を管理するシンプルな「購入履歴」テーブルです。
◾️purchase_history(購入履歴)
purchase_id | user_id | purchase_time | product_name | purchase_amount |
---|---|---|---|---|
1 | 101 | 2024-11-11 10:15:00 | ノートパソコン | 120,000 |
2 | 101 | 2024-11-12 08:00:00 | マウス | 15,000 |
3 | 101 | 2024-11-12 20:30:00 | キーボード | 25,000 |
4 | 102 | 2024-11-11 09:45:00 | デスクチェア | 30,000 |
5 | 101 | 2024-11-13 07:30:00 | イヤフォン | 8,000 |
6 | 102 | 2024-11-12 17:15:00 | モニター | 50,000 |
◾️テーブルの概要
カラム(英名) | カラム名(日本語名) |
---|---|
purchase_id | 購入ID |
user_id | ユーザーID |
purchase_time | 購入日時 |
product_name | 商品名 |
purchase_amount | 購入金額 |
⭐️記述方法
上記のテーブルで特定のユーザーが最新の購入履歴のレコードを1件取得したい場合、下記のように記述します。
SELECT *
FROM purchase_history
WHERE user_id = 101
ORDER BY purchase_time DESC
FETCH FIRST 1 ROWS ONLY;
◾️抽出結果
purchase_id | user_id | purchase_time | product_name | purchase_amount |
---|---|---|---|---|
5 | 101 | 2024-11-13 07:30:00 | イヤフォン | 8,000 |
ユーザー101が購入した商品の中で、最も新しい購入履歴のレコードを1件だけ取得できました。
◾️FETCH FIRST n ROWS ONLYとは
データの取得件数を制限するための句です。ORDER BYと組み合わせることでソートした結果から上位の n 件を取得することができます。
◾️Oracle Database 11c 以前のバージョン
バージョンがOracle Database 11c 以前の場合は、FETCH FIRST n ROWS ONLY
がサポートされていないため記述することができません。その代わり、別の方法でレコードを取得できるため紹介します。
SELECT *
FROM (
SELECT *
FROM purchase_history
WHERE user_id = 101
ORDER BY purchase_time DESC
)
WHERE ROWNUM = 1;
上記の記述をすることで、Oracle Database 11c 以前のバージョンでも同様の結果が取得できます。
◾️他のDBを使用する場合
Oracleの場合を紹介しましたが、他のDBでは若干書き方が異なるためこちらで紹介していきます。
・MySQL & PostgreSQLの場合
MySQLやPostgreSQLでは下記の記述をします。
SELECT *
FROM purchase_history
WHERE user_id = 101
ORDER BY purchase_time DESC
LIMIT 1;
FETCH FIRST n ROWS ONLY
の部分をLIMIT n
とすることで同様の結果が取得できます。
・SQL Serverの場合
SQL Serverでは以下記の記述をします。
SELECT TOP 1 *
FROM purchase_history
WHERE user_id = 101
ORDER BY purchase_time DESC;
SQL ServerではLIMIT n
やFETCH FIRST n ROWS ONLY
といった記述は使えません。その代わり、SELECTの次にTOP n
を記述することで同様の結果が取得できます。
⭐️おわりに
最新のレコードのみを1件取得したいケースとして下記のようなシナリオが挙げられます。
・顧客の最新の購入情報だけを取得したい
・商品の最新価格だけを取得したい
・最新の在庫情報や入庫情報だけを取得したい
・ユーザーの最新のアクティビティ情報だけを取得したい
最新のレコードのみを1件取得したいケースってなかなかないかもしれませんが、上記のようなシナリオで開発をする際にこの記事が少しでも参考になれば幸いです。
Discussion