[英]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.