Oracle SQL: ID ごとに最新の数量を抽出する
このガイドでは、Oracle SQL のタイムスタンプ付きデータを含むテーブルから一意の ID ごとに最新の数量を効率的に取得する方法を説明します。
核となるアプローチには、ネストされたクエリ戦略が含まれます。
<code class="language-sql">SELECT id, MAX(ts) AS "DATE", MAX(quantity) AS "QUANTITY" FROM ( SELECT id, ts, RANK() OVER (PARTITION BY id ORDER BY ts DESC) AS rnk, quantity FROM your_table_name ) ranked_data WHERE rnk = 1 GROUP BY id;</code>
このクエリは次のように動作します:
内部クエリ (ranked_data): このサブクエリは、RANK()
ウィンドウ関数を使用して、タイムスタンプ (id
) の降順で各 ts
グループ内の各行にランクを割り当てます。 。 各 id
の最新レコードには 1 のランクが与えられます。
外部クエリ: このクエリは内部クエリの結果をフィルターし、rnk = 1
を持つ行 (最新のレコード) のみを選択します。 次に、結果を id
でグループ化し、MAX()
を使用して対応するタイムスタンプと数量を取得します。 最新のタイムスタンプが最新の数量も意味すると仮定すると、MAX(quantity)
を GROUP BY id
とともに使用するのが適切であることに注意してください。最新のタイムスタンプは同じだが量が異なる複数の行が存在する可能性がある場合は、別の集計方法が必要になる可能性があります (より複雑なクエリの FIRST_VALUE
など)。
機能強化:
1.時間ベースのフィルタリング: 結果を特定の時間枠 (過去 XX 分など) に制限するには、WHERE
句を内部クエリに追加します:
<code class="language-sql">WHERE ts >= SYSTIMESTAMP - INTERVAL 'XX' MINUTE</code>
2.別のテーブルとの結合: 別のテーブルからのデータ (例: 追加の ID 情報を持つ id_table
) を組み込むには、外側のクエリで JOIN
を使用します:
<code class="language-sql">SELECT id || '-' || idname AS "ID-IDNAME", MAX(ts) AS "DATE", MAX(quantity) AS "QUANTITY" FROM ( SELECT id, ts, RANK() OVER (PARTITION BY id ORDER BY ts DESC) AS rnk, quantity FROM your_table_name ) ranked_data INNER JOIN id_table ON ranked_data.id = id_table.id WHERE rnk = 1 GROUP BY id || '-' || idname;</code>
your_table_name
と id_table
を実際のテーブル名に置き換えてください。 この洗練されたアプローチにより、Oracle SQL で最新の数量データを取得するための堅牢かつ柔軟なソリューションが提供されます。
以上がOracle SQLでIDおよびタイムスタンプごとに最新の数量を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。