【问题标题】:Other columns with GROUP BY带有 GROUP BY 的其他列
【发布时间】:2021-02-20 12:54:04
【问题描述】:

我有一个用于天气读数的 PostgreSQL 数据库:

CREATE TABLE "weather"
  (
  "id" SERIAL PRIMARY KEY,
  "dtstamp" TIMESTAMP NOT NULL UNIQUE,
  "temperature" REAL NOT NULL,
  ...
  } ;

我正在获取每日最低温度:

SELECT
  DATE_TRUNC('day'::TEXT, weather.dtstamp) AS dts,
  ROUND((MIN(weather.temperature))::NUMERIC, 1) AS mintemp
FROM weather
GROUP BY (date_trunc('day'::text, weather.dtstamp))
ORDER BY (date_trunc('day'::text, weather.dtstamp)) DESC
LIMIT 28 ;

我怎样才能提取出最小值发生的时间,以及如果超过一次,如何应对?

【问题讨论】:

    标签: postgresql aggregate


    【解决方案1】:

    您可以将天气与一天和 tempetarue 的结果表相结合。

    这是老式的方式,我很确定窗口函数有一些更简洁的方式......

    SELECT 
      DATE_TRUNC('day'::TEXT, w1.dtstamp) AS day,
      dtstamp,
      ROUND(w1.temperature::NUMERIC, 1) AS mintemp
    FROM weather w1  
     INNER JOIN 
    (SELECT
      DATE_TRUNC('day'::TEXT, wmin.dtstamp) AS dts,
      ROUND((MIN(wmin.temperature))::NUMERIC, 1) AS mintemp
    FROM weather wmin
    GROUP BY (date_trunc('day'::text, wmin.dtstamp))) w2
      on DATE_TRUNC('day'::TEXT, w1.dtstamp) = w2.dts
         AND ROUND(w1.temperature::NUMERIC, 1) = w2.mintemp
    

    通过这种方式,您可以始终使用(四舍五入的)最低温度。

    但是您只能在最终选择中进行四舍五入,并且只有具有浮动最小温度时间的记录

    db-fiddle

    【讨论】:

    • 谢谢,这正是我想要的。也会在最终选择中进行四舍五入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2018-02-12
    • 1970-01-01
    相关资源
    最近更新 更多