PostgreSQL技术问询:获取指定val_io_id对应的val_value最小值及完整val_date时间
解决PostgreSQL中查询最小值对应完整时间的问题
针对你需要查询指定val_io_id的最小val_value及其对应完整val_date的需求,这里提供两种实用的方法,解决你原有SQL丢失时间部分的问题:
方法1:使用窗口函数(推荐)
窗口函数可以精准定位到最小val_value对应的那条记录,同时保留完整的时间信息。如果存在多条记录拥有相同的最小val_value,你可以根据需求调整排序规则:
SELECT val_date, val_io_id, val_value FROM ( SELECT val_date, val_io_id, val_value, ROW_NUMBER() OVER (PARTITION BY val_io_id, DATE(val_date) ORDER BY val_value) AS rn FROM data_store.vals_1 WHERE val_io_id = 9224 AND DATE(val_date) = '2021-12-30' ) AS ranked WHERE rn = 1;
逻辑说明:
- 内层查询通过
ROW_NUMBER()给每个val_io_id和日期分组内的行按val_value升序编号,最小值的行编号为1 - 外层筛选出编号为1的行,就能得到对应最小值的完整
val_date、val_io_id和val_value
方法2:子查询关联原表
先通过子查询找到指定条件下的最小val_value,再关联原表获取对应的完整记录:
SELECT v.val_date, v.val_io_id, v.val_value FROM data_store.vals_1 v WHERE v.val_io_id = 9224 AND DATE(v.val_date) = '2021-12-30' AND v.val_value = ( SELECT MIN(val_value) FROM data_store.vals_1 WHERE val_io_id = 9224 AND DATE(val_date) = '2021-12-30' );
注意事项:
如果有多条记录的val_value都是最小值,这个方法会返回所有符合条件的行;而方法1默认只返回其中一行(若要返回所有,可将ROW_NUMBER()替换为RANK())。
原有SQL的问题
你之前的查询用DATE(val_date)分组,这会把同一天的所有记录合并成一行,因此只能拿到日期部分,无法保留具体的时间信息。我们的目标是找到最小值对应的单条记录,而不是对日期分组聚合。
执行上述任一方法后,你会得到期望的结果:
| val_date | val_io_id | val_value |
|---|---|---|
| 2021-12-30 03:20:00+02 | 9224 | 30,3 |
内容的提问来源于stack exchange,提问作者Adrian Oprea
相关产品推荐
相关产品推荐

