【PostgreSQL】最新レコードを取得するSQLまとめ(ORDER BY・DISTINCT ON解説)

※ この記事にはアフィリエイトリンクが含まれます

PostgreSQLで開発をしていると、「最新レコードを取得したい」という場面はよくあります。

例えば次のようなケースです。

  • 最新の注文データを取得したい
  • 最新のログを確認したい
  • ユーザーごとの最新レコードを取得したい

一見すると簡単そうですが、実際には状況によってSQLの書き方が変わります。

  • 最新1件だけ取得する場合
  • 条件付きで最新レコードを取得する場合
  • グループごとの最新データを取得する場合

この記事では、PostgreSQLで最新レコードを取得する方法をわかりやすく解説します。

この記事を読むと、次の内容が理解できます。

  • 最新レコードを取得する基本SQL
  • 条件付きで最新レコードを取得する方法
  • グループごとの最新レコード取得
  • パフォーマンスを改善する方法

実務でもよく使うテクニックなので、ぜひ参考にしてください。

目次

結論 最新レコード取得の基本SQL

まず結論から紹介します。

PostgreSQLで最新レコードを取得する基本のSQLは以下です。

SELECT *
FROM orders
ORDER BY created_at DESC
LIMIT 1;

このSQLのポイントは以下の通りです。

  • ORDER BY created_at DESC
    →作成日時を新しい順に並べる
  • LIMIT 1
    →1件だけ取得する

この書き方が、最もシンプルでよく使われる方法です。

例えば、次のようなテーブルがあったとします。

idproductcreated_at
1A2024-01-01
2B2024-02-01
3C2024-03-01

この場合、取得されるのはid=3のレコードになります。

ORDER BY + LIMIT で最新レコードを取得する

PostgreSQLで最新レコードを取得する場合、基本はORDER BY + LIMITを使用します。

SELECT *
FROM orders
ORDER BY created_at DESC
LIMIT 1;

処理の流れは次の通りです。

  • created_at で並び替え
  • 新しい順(DESC)にする
  • 上位1件を取得する

この書き方は非常にシンプルで、多くのシステムで利用されています。

ただし、注意点もあります。

テーブルの件数が多い場合、インデックスが無いとパフォーマンスが悪くなる可能性があります。
そのため、実務ではインデックスの作成も重要になります。

条件付きで最新レコードを取得する

特定の条件に絞った上で、最新レコードを取得することもよくあります。

例えば、「ユーザーごとの最新注文」を取得したい場合です。

SELECT *
FROM orders
WHERE user_id = 10
ORDER BY created_at DESC
LIMIT 1;

このSQLでは以下の処理を行っています。

  • WHERE user_id = 10
    → ユーザーIDで絞り込み
  • ORDER BY created_at DESC
    → 最新順に並び替え
  • LIMIT 1
    → 最新1件を取得

このようにWHERE句と組み合わせることで、条件付きの最新データを簡単に取得できます

実務では以下のような用途でよく使われます。

  • ユーザーの最新ログイン履歴
  • 商品の最新価格
  • 顧客の最新注文

グループごとの最新レコードを取得する

少し難易度が上がりますが、
グループごとの最新レコードを取得したいケースもよくあります。

例えば次のようなケースです。

  • ユーザーごとの最新注文
  • 商品ごとの最新価格
  • 顧客ごとの最新取引

PostgreSQLでは、このような場合にDISTINCT ONを使う方法があります。

SELECT DISTINCT ON (user_id) *
FROM orders
ORDER BY user_id, created_at DESC;

このSQLのポイントは次の通りです。

  • DISTINCT ON (user_id)
    → user_idごとに1件取得
  • ORDER BY user_id, created_at DESC
    → user_idごとに最新レコードを先頭にする

つまり、各ユーザーの中で最も新しいレコードだけ取得することができます。

DISTINCT ON はPostgreSQL特有の機能で、他のデータベースでは使えない場合があるため注意が必要です。

しかし、PostgreSQLでは非常に便利な機能なので、覚えておくと役立ちます。

サブクエリで最新レコードを取得する方法

もう一つの方法として、MAX関数を使う方法もあります。

SELECT *
FROM orders
WHERE created_at = (
    SELECT MAX(created_at)
    FROM orders
);

このSQLでは以下の処理を行っています。

1. サブクエリで最大日時を取得

SELECT MAX(created_at)
FROM orders

2. その日時と一致するレコードを取得

この方法のメリットは、SQLの意味がわかりやすいことです。

ただし、データ量が多い場合はパフォーマンスが落ちることもあるため、実務では ORDER BY + LIMIT が使われることが多いです。

パフォーマンスを改善する方法

最新レコード取得では、インデックスの有無がパフォーマンスに大きく影響します。

例えば、以下のインデックスを作成すると、検索が高速になります。

CREATE INDEX idx_orders_created_at
ON orders(created_at DESC);

インデックスがあると、PostgreSQLは並び替えを効率よく行えるようになります。

特に次のようなSQLでは効果が大きいです。

SELECT *
FROM orders
ORDER BY created_at DESC
LIMIT 1;

大規模なテーブルでは、このインデックスだけでクエリ速度が大きく改善することがあります。

まとめ

PostgreSQLで最新レコードを取得する方法はいくつかありますが、基本は次の通りです。

最新1件を取得

ORDER BY created_at DESC
LIMIT 1

条件付きで取得

WHERE 条件
ORDER BY created_at DESC
LIMIT 1

グループごとの最新レコード

DISTINCT ON

また、データ量が多い場合はインデックスの作成も重要になります。

最新レコード取得は実務でも頻繁に使うSQLなので、ぜひ覚えておきましょう。

PostgreSQLは、現場でも広く使われている信頼性の高いデータベースです。もしこれから本格的に学び、実務で通用する力をつけたい方には、RareTECHをチェックしてみてください。実案件ベースのカリキュラムで、あなたのスキルを次のステージへ引き上げてくれるはずです。


なんくる

「本当にエンジニアとしてやっていけるか不安…」という方も、実践的な開発に関わることで、転職後の働き方を事前に体感できますよ。

実務で使えるDBスキルとともに、プログラミングスキルをちゃんと身につけたいなら、
RareTECH無料カウンセリングで、学ぶ目的やゴールをプロと一緒に明確にしてみましょう。独学では得られない「実践的な成長の道筋」が見えてきます。


もしこの内容を通して、PostgreSQLについてさらに理解を深めたいと感じられたなら、信頼できる講座や書籍を紹介した別記事をご覧いただくのも良いかと思います。ご自身の学びに、きっとお役立ていただけるはずです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

沖縄出身のエンジニアです。IT業界で5年以上の経験があり、主にC#やPHPを使って開発を行ってきました。新しい技術にも興味があり、日々学びながらスキルアップを目指しています。

コメント

コメントする

CAPTCHA


目次