You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_dateval_io_idval_value
2021-12-30 03:20:00+02922430,3

内容的提问来源于stack exchange,提问作者Adrian Oprea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:54:40