SQL データベースの各グループから先頭行を抽出する
データのグループ化と分析はデータベース管理の基本です。 多くの場合、各グループ内の一番上の行 (最新のエントリなど) を識別する必要があります。 この記事では、SQL を使用してこれを効率的に実現する方法を説明します。
ウィンドウ関数の活用
SQL にはこのタスク用の専用の集計関数がありませんが、ウィンドウ関数は洗練されたソリューションを提供します。 これらの関数は、定義された範囲内の行セットを操作し、データ サブセットの計算と集計を可能にします。
「DocumentID」、「Status」、および「DateCreated」列を持つ「DocumentStatusLogs」という名前のテーブルについて考えてみましょう。各ドキュメントの最新ステータスを取得するには、次の SQL クエリを使用します:
<code class="language-sql">WITH RankedLogs AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY DocumentID ORDER BY DateCreated DESC) as rn FROM DocumentStatusLogs ) SELECT * FROM RankedLogs WHERE rn = 1;</code>
共通テーブル式 (CTE)「RankedLogs」は、ROW_NUMBER()
を使用して、各「DocumentID」パーティション内の行を「DateCreated」(降順) 順にランク付けします。次に、メイン クエリは rn = 1
を持つ行のみを選択し、事実上各グループの先頭行を返します。
正規化とデータの整合性
元の質問はデータベースの正規化にも触れています。 テーブル例 (「DocumentStatusLogs」) は、ステータス変更の履歴を保持します。 この履歴を保持しておくと、時間の経過に伴う変化を追跡するのに役立ちます。 ただし、最新のステータスにすぐにアクセスする必要がある場合は、「CurrentDocuments」テーブルに「CurrentStatus」列を追加し、トリガーを使用してそれを更新することを検討してください。 これには、データの一貫性を確保し、異常を回避するための慎重な管理が必要です。
ウィンドウ関数とデータ正規化を慎重に組み合わせることにより、SQL データベース内の各グループの最上位行を効果的に取得できます。
以上がSQL データベース内の各グループの最上位行を効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。