如何在PostgreSQL中按日期对日期进行分组?

时间:2018-11-13 06:08:29

标签: sql postgresql

我有一个非常简单的表,其中有2列。第一个显示时间(timestamp),第二个显示当时的汽车速度(float8)。

|      DATE_TIME      | SPEED |
|---------------------|-------|
| 2018-11-09 00:00:00 | 256   |
| 2018-11-09 01:00:00 | 659   |
| 2018-11-09 02:00:00 | 256   |
|      other dates    | xxx   |
| 2018-11-21 21:00:00 | 651   |
| 2018-11-21 22:00:00 | 515   |
| 2018-11-21 23:00:00 | 849   |

我们可以说是11月9日至11月21日。如何按周分组该时段。实际上我想要这样的结果:

|      DATE_TIME      | AVG_SPEED |
|---------------------|-----------|
| 9-11 November       | XXX       |
| 12-18 November      | YYY       |
| 19-21 November      | ZZZ       |

我使用PostgreSQL 10.4

我使用这样的SQL语句来了解特定日期的星期几:

SELECT EXTRACT(WEEK FROM TIMESTAMP '2018-11-09 00:00:00'); 

编辑

@ tim-biegeleisen,当我将周期从“ 2018-11-01”设置为“ 2018-11-13”时,您的sql语句返回2个结果:

enter image description here

实际上我需要这样的结果:

2018-11-01 00:00:00 | 2018-11-04 23:00:00
2018-11-05 00:00:00 | 2018-11-11 23:00:00
2018-11-12 00:00:00 | 2018-11-13 05:00:00

您可以在日历中看到该时段有3周。

enter image description here

1 个答案:

答案 0 :(得分:3)

我们可以使用日历表来做到这一点。该答案假定一周从数据集中的第一个日期开始。您也可以在假设其他情况下执行此操作,例如一个其他星期的标准周。

WITH dates AS (
    SELECT date_trunc('day', dd)::date AS dt
    FROM generate_series
    ( '2018-11-09'::timestamp 
    , '2018-11-21'::timestamp
    , '1 day'::interval) dd
),
cte AS (
    SELECT t1.dt, t2.DATE_TIME, t2.SPEED,
        EXTRACT(week from t1.dt) week
    FROM dates t1
    LEFT JOIN yourTable t2
        ON t1.dt = t2.DATE_TIME::date
)

SELECT
    MIN(dt)::text || '-' || MAX(dt) AS DATE_TIME,
    AVG(SPEED) AS AVG_SPEED
FROM cte
GROUP BY
    week
ORDER BY
    MIN(dt);

Demo

相关问题