我有一个非常简单的表,其中有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周。
答案 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);