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中文網其他相關文章!