如何筛选metric_name、instance_id、instance唯一的最新数据行
获取metric_name、instance_id、instance组合唯一的最新数据行
可以用窗口函数ROW_NUMBER()来实现这个需求,这是目前通用且高效的方案之一。核心逻辑是:按metric_name、instance_id、instance三个字段分组,每组内按timestamp降序排序,标记行号后筛选出行号为1的记录——也就是每组的最新数据行。
完整SQL语句如下:
SELECT timestamp, metric_name, instance_id, value_sum, unit, instance FROM ( SELECT timestamp, metric_name, instance_id, value_sum, unit, instance, ROW_NUMBER() OVER ( PARTITION BY metric_name, instance_id, instance ORDER BY timestamp DESC ) AS row_num FROM tbl_metrics WHERE (metric_name = 'Disk Available' OR metric_name = 'Disk Percent Used') AND instance != '' ) AS ranked_data WHERE row_num = 1 ORDER BY timestamp DESC;
代码说明:
- 内层子查询:给每条记录添加
row_num字段,相同metric_name、instance_id、instance组合的记录被归为一组,组内按timestamp从新到旧排序,最新记录的行号为1。 - 外层查询:仅保留
row_num = 1的记录,即每个唯一组合的最新数据行。
如果你的数据库支持QUALIFY子句(比如BigQuery、Snowflake等),还可以简化写法,无需嵌套子查询:
SELECT timestamp, metric_name, instance_id, value_sum, unit, instance FROM tbl_metrics WHERE (metric_name = 'Disk Available' OR metric_name = 'Disk Percent Used') AND instance != '' QUALIFY ROW_NUMBER() OVER ( PARTITION BY metric_name, instance_id, instance ORDER BY timestamp DESC ) = 1 ORDER BY timestamp DESC;
兼容旧版本数据库的写法:关联子查询
如果数据库不支持窗口函数,也可以用关联子查询获取每组的最大时间戳,再匹配对应记录:
SELECT t1.timestamp, t1.metric_name, t1.instance_id, t1.value_sum, t1.unit, t1.instance FROM tbl_metrics t1 WHERE (t1.metric_name = 'Disk Available' OR t1.metric_name = 'Disk Percent Used') AND t1.instance != '' AND t1.timestamp = ( SELECT MAX(timestamp) FROM tbl_metrics t2 WHERE t2.metric_name = t1.metric_name AND t2.instance_id = t1.instance_id AND t2.instance = t1.instance ) ORDER BY t1.timestamp DESC;
这种写法逻辑直观,但数据量较大时性能可能不如窗口函数,因为子查询会对每组单独执行一次。
内容的提问来源于stack exchange,提问作者Pa3k.m
相关产品推荐
相关产品推荐

