我有如下查询
SELECT DISTINCT table_1.id,
table_1.time_utc
table_1.city_uuid,
cast(table_2.score_rate as decimal(5,3)) as score_rate
FROM integrated_delivery.trip_table_1_fact table_1,
integrated_product.driver_score_v2 table_2
WHERE table_1.id = table_2.id
AND table_1.city_uuid = table_2.city_id
AND table_1.day = date '2019-04-01'
AND table_2.extract_dt = 20190331
AND EXISTS
(SELECT NULL
FROM table_3
WHERE table_1.id = table_3.id
AND table_1.time_utc >= table_3.start_time_utc
AND table_1.time_utc <= table_3.end_time_utc)
我想更改此查询,使其每隔30分钟返回一次table_1.offer_time_utc。
表_1看起来像样行
id time_utc
b7-19b36a410ab0 2019-04-16 22:00:09.415
53-9127667e288e 2019-04-17 01:06:16.590
6b-a96c3ea196c4 2019-04-16 22:00:09.908
Table_3看起来像
id start_time_utc end_time_utc
35-e512d080e5d3 2019-01-29 02:00:00.000 2019-01-29 03:30:00.000
94-07e7036c1e4b 2019-01-29 01:30:00.000 2019-01-29 02:30:00.000
7d-20736d277064 2019-01-29 01:00:00.000 2019-01-29 03:30:00.000
我要在哪里调整上面的查询,以便它以30分钟的间隔提取所有记录或行,并且还具有代表该间隔的列?
类似
interval
-------------------
2010-11-16 10:30:00
2010-11-16 10:35:00
2010-11-16 10:40:00
2010-11-16 10:45:00
2010-11-16 10:50:00
2010-11-16 10:55:00
预期的输出基本上将是我在table_1示例中已经拥有的输出,但是间隔如下:
Id Interval ( time_utc)
b7-19b36a410ab0 2010-11-16 10:30:00
53-9127667e288e 2010-11-16 11:00:00
6b-a96c3ea196c4 2010-11-16 11:30:00
谢谢!
答案 0 :(得分:1)
TL; DR
以下构造会为任何时间戳生成30分钟的较低边界:
date_trunc('hour', table_1.time_utc) + (
CASE
WHEN (extract(minute from table_1.time_utc) >= 30) THEN
'30 minutes'::interval
ELSE
'0'::interval
END
)
长版
适用于您的情况:
SELECT DISTINCT table_1.id,
table_1.time_utc,
date_trunc('hour', table_1.time_utc) + CASE
WHEN (extract(minute from table_1.time_utc) >= 30) THEN '30 minutes'::interval
ELSE '0'::interval
END AS time_utc_aligned,
table_1.city_uuid,
cast(table_2.score_rate as decimal(5,3)) as score_rate
FROM integrated_delivery.trip_table_1_fact table_1,
integrated_product.driver_score_v2 table_2
WHERE table_1.id = table_2.id
AND table_1.city_uuid = table_2.city_id
AND table_1.day = date '2019-04-01'
AND table_2.extract_dt = 20190331
AND EXISTS (
SELECT NULL
FROM table_3
WHERE table_1.id = table_3.id
AND table_1.time_utc >= table_3.start_time_utc
AND table_1.time_utc <= table_3.end_time_utc
)
;
...会产生(with test data):
id | time_utc | time_utc_aligned | city_uuid | score_rate
-----------------+-------------------------+---------------------+--------------------------------------+------------
53-9127667e288e | 2019-04-17 01:06:16.59 | 2019-04-17 01:00:00 | 909153dc-c1ff-4e65-a32e-c9194ddfbec9 | 4.662
6b-a96c3ea196c4 | 2019-04-16 22:00:09.908 | 2019-04-16 22:00:00 | b2d402a2-ba2d-483b-a4c0-fae95ee1700c | 2.250
b7-19b36a410ab0 | 2019-04-16 22:00:09.415 | 2019-04-16 22:00:00 | 889f9aed-f399-4059-b97b-d67b0af0096d | 1.744
如果您使用timescale扩展名,则使用其time_bucket
C function可以使其更具可读性:
SELECT DISTINCT table_1.id,
table_1.time_utc,
time_bucket('30 minutes', table_1.time_utc) AS time_utc_aligned,
table_1.city_uuid,
cast(table_2.score_rate as decimal(5,3)) as score_rate
FROM integrated_delivery.trip_table_1_fact table_1,
integrated_product.driver_score_v2 table_2
WHERE table_1.id = table_2.id
AND table_1.city_uuid = table_2.city_id
AND table_1.day = date '2019-04-01'
AND table_2.extract_dt = 20190331
AND EXISTS (
SELECT NULL
FROM table_3
WHERE table_1.id = table_3.id
AND table_1.time_utc >= table_3.start_time_utc
AND table_1.time_utc <= table_3.end_time_utc
)
;
答案 1 :(得分:1)
我将使用公用表表达式(CTE)并每30分钟创建一个日期时间间隔。您可以在dbfiddle中查看我的示例数据:http://www.sqlfiddle.com/#!4/bf5a7/18
WITH interval_dates as
(select timestamp '2019-04-16 00:00:00'
+ NUMTODSINTERVAL(30*rownum-30,'MINUTE') as from_interval,
timestamp '2019-04-16 00:00:00'
+ NUMTODSINTERVAL(30*rownum,'MINUTE') as to_interval
from dual connect by level <= 2000)
select t1.*, dt.from_interval
from interval_dates dt
,(SELECT DISTINCT table_1.id,
table_1.time_utc
table_1.city_uuid,
cast(table_2.score_rate as decimal(5,3)) as score_rate
FROM integrated_delivery.trip_table_1_fact table_1,
integrated_product.driver_score_v2 table_2
WHERE table_1.id = table_2.id
AND table_1.city_uuid = table_2.city_id
AND table_1.day = date '2019-04-01'
AND table_2.extract_dt = 20190331
AND EXISTS
(SELECT NULL
FROM table_3
WHERE table_1.id = table_3.id
AND table_1.time_utc >= table_3.start_time_utc
AND table_1.time_utc <= table_3.end_time_utc)) t1
where t1.time_utc >= dt.from_interval and t1.time_utc < dt.to_interval
抽样结果:
ID TIME_UTC FROM_INTERVAL
b7-19b36a410ab0 2019-04-16 22:00:09.0 2019-04-16 22:00:00.0
6b-a96c3ea196c4 2019-04-16 22:00:09.0 2019-04-16 22:00:00.0
53-9127667e288e 2019-04-17 01:06:16.0 2019-04-17 01:00:00.0