用于从Postgres表获取第二天预测的SQL查询

时间:2014-11-20 16:20:09

标签: sql database postgresql

下表包含预测数据行。预测每小时到达两次。该预测将包含7天的数据,每天24小时。我想要一种有效的方法来查询表格,并且只能从14:10获得预测(预测来自:每小时10和45)并且仅在预测之后的那天(而不是另外6天)

CREATE TABLE
    forecast_table
    (
        forecast_timestamp TIMESTAMP(6) WITHOUT TIME ZONE NOT NULL,
        forecast_date DATE NOT NULL,
        forecast_hour INTEGER NOT NULL,
        number_value NUMERIC NOT NULL,
        PRIMARY KEY (forecast_timestamp, forecast_date , forecast_hour )
    );

例如,我想了解2014年1月1日至2014年2月1日至2014年1月1日期间每天的所有24小时预报。这些必须是前一天的14:10预测。

我觉得必须有一种有效的方法来查询这个表,并且每天只需要24小时。

1 个答案:

答案 0 :(得分:0)

您所寻找的并不明显,主要是因为您的表格中有很多日期和时间,并且不清楚数据实际上是什么样的或结果应该是什么看起来像。

您可以使用all kinds of date and time functions

这应该列出所有预测,时间为14:10,发生在2014年1月,当发布时,是为了预测未来不到1天的日期。有大约十几种方式来写这个,你需要四处寻找好的方法。如果你能找到一种方法来编写它,使你的字段不在函数中,那将是最好的。

SELECT *
FROM forecast_table
WHERE EXTRACT(HOUR FROM forecast_timestamp) = 14
    AND EXTRACT(MINUTE FROM forecast_timestamp) = 10
    AND forecast_timestamp > forecast_date - interval '1 day'  
    AND date_trunc('month', forecast_date) = timestamp '2014-01-01 00:00:00'

我无法判断您是否希望forecast_hours字段计入您希望应用于forecast_timestamp的24小时限制。如果你这样做:

SELECT *
FROM forecast_table
WHERE EXTRACT(HOUR FROM forecast_timestamp) = 14
    AND EXTRACT(MINUTE FROM forecast_timestamp) = 10
    AND forecast_timestamp > (forecast_date + (forecast_hour * '1 hour'::interval)) - interval '1 day'  
    AND date_trunc('month', forecast_date) = timestamp '2014-01-01 00:00:00'

确实,forecast_hour字段确实应该是数据类型interval hour而不是int