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中文网其他相关文章!