繁体   English   中英

如何在PostgreSQL中按日期分组日期?

[英]How to group date by week in 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结果:

在此处输入图片说明

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

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周。

在此处输入图片说明

我们可以使用日历表来做到这一点。 该答案假定一周从数据集中的第一个日期开始。 您还可以假设其他条件来执行此操作,例如根据其他标准时间。

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);

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM