🍋

【SQL】WHERE句で絞ったレコードの中から最新のレコードのみを1件取得する方法

2024/11/14に公開

⭐️はじめに

最新の情報を持ったレコードを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件取得したい場合、下記のように記述します。

SQL
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がサポートされていないため記述することができません。その代わり、別の方法でレコードを取得できるため紹介します。

SQL
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では下記の記述をします。

SQL
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では以下記の記述をします。

SQL
SELECT TOP 1 *
FROM purchase_history
WHERE user_id = 101
ORDER BY purchase_time DESC;

SQL ServerではLIMIT nFETCH FIRST n ROWS ONLYといった記述は使えません。その代わり、SELECTの次にTOP nを記述することで同様の結果が取得できます。

⭐️おわりに

最新のレコードのみを1件取得したいケースとして下記のようなシナリオが挙げられます。
・顧客の最新の購入情報だけを取得したい
・商品の最新価格だけを取得したい
・最新の在庫情報や入庫情報だけを取得したい
・ユーザーの最新のアクティビティ情報だけを取得したい

最新のレコードのみを1件取得したいケースってなかなかないかもしれませんが、上記のようなシナリオで開発をする際にこの記事が少しでも参考になれば幸いです。

Discussion