Oracle SQL: ID ごとに最新の数量を抽出する
このガイドでは、Oracle SQL データベース内の一意の ID ごとに最新の数量を効率的に取得する方法を説明します。 次の構造を持つ「qtys」というテーブルがあると仮定します:
ID
: 各レコードの一意の識別子。TS
: 数量がいつ記録されたかを示すタイムスタンプ。QTY
: 数量の値。目標は、すべての個別の QTY
について、最新の数量 (TS
) とそれに対応するタイムスタンプ (ID
) を取得することです。
解決策:
次のクエリは、MAX()
関数と GROUP BY
句を利用してこれを実現します。
<code class="language-sql">SELECT id, MAX(TS) AS "Latest Timestamp", MAX(QTY) KEEP (DENSE_RANK LAST ORDER BY TS) AS "Latest Quantity" FROM qtys GROUP BY id;</code>
このクエリは、データを ID
でグループ化し、グループごとに最大のタイムスタンプ (MAX(TS)
) を選択します。 重要なのは、MAX(QTY) KEEP (DENSE_RANK LAST ORDER BY TS)
は、複数のエントリが同じ最大タイムスタンプを共有している場合でも、最新 タイムスタンプに関連付けられた数量が確実に取得されるようにすることです。
代替アプローチ:
1. 過去 X 分間のフィルタリング:
結果を過去 X 分以内のエントリに制限するには、WHERE
句を組み込みます。
<code class="language-sql">SELECT id, MAX(TS) AS "Latest Timestamp", MAX(QTY) KEEP (DENSE_RANK LAST ORDER BY TS) AS "Latest Quantity" FROM qtys WHERE TS > SYSTIMESTAMP - INTERVAL '30' MINUTE GROUP BY id;</code>
'30' MINUTE
を希望の時間間隔に置き換えます。
2. 別のテーブルとの結合:
別のテーブルからデータを組み込む必要がある場合 (例: idname
列を持つ "names")、JOIN
:
<code class="language-sql">SELECT t1.id || '-' || t2.idname AS "ID-IDNAME", MAX(t1.TS) AS "Latest Timestamp", MAX(t1.QTY) KEEP (DENSE_RANK LAST ORDER BY t1.TS) AS "Latest Quantity" FROM qtys t1 JOIN names t2 ON t1.id = t2.id GROUP BY t1.id || '-' || t2.idname;</code>
これは、id
列に基づいて "qtys" と "names" を結合し、結合された識別子の ID
と idname
を連結します。 次に、MAX()
関数が結合されたデータに対して動作します。 特定のデータベース スキーマに一致するようにテーブル名と列名を必ず調整してください。
以上がOracle SQLで各IDの最新の数量を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。