我有两个表,一个提到事件的开始和结束时间以及相应的值,另一个在每天午夜记录值。
CREATE TABLE table1 (
id integer,
date_strt timestamp,
date_end timestamp,
strt_unit integer,
end_unit integer
);
INSERT INTO table1 (id, date_strt, date_end,strt_unit,end_unit)
VALUES
(1, '2023-10-27 12:00:00','2023-10-31 12:00:00', 5,72),
(2, '2023-10-30 12:15:00','2023-11-02 00:00:00', 78,90);
CREATE TABLE table2 (
id integer,
dates timestamp,
unit integer
);
INSERT INTO table2 (id, dates, unit)
VALUES
(1, '2023-10-28 00:00:00', 55),
(1, '2023-10-29 00:00:00', 60),
(1, '2023-10-30 00:00:00', 65),
(1, '2023-10-31 00:00:00', 70),
(2, '2023-10-30 00:00:00', 75),
(2, '2023-10-31 00:00:00', 80),
(2, '2023-11-01 00:00:00', 85),
(2, '2023-11-02 00:00:00', 90);
字符串
我想获得这样的数据集,其中我通过使用表2中可用的日期获得从表1中提到的开始日期到结束日期的每天午夜00:00:00的数据差异。
id start_time start_value end_time end_value
1, '2023-10-27 12:00:00', 5, '2023-10-28 00:00:00', 55
1, '2023-10-28 00:00:00', 55, '2023-10-29 00:00:00', 60
1, '2023-10-29 00:00:00', 60, '2023-10-30 00:00:00', 65
1, '2023-10-30 00:00:00', 65, '2023-10-31 00:00:00', 70
1, '2023-10-31 00:00:00', 70, '2023-10-31 12:00:00', 72
2, '2023-10-30 12:15:00', 78, '2023-10-31 00:00:00', 80
2, '2023-10-31 00:00:00', 80, '2023-11-01 00:00:00', 85
2, '2023-11-01 00:00:00', 85, '2023-11-02 00:00:00', 90
型
我计划使用1天作为间隔在开始和结束日期之间生成一个日期序列,但无法生成适当的日期,因此无法在其中进一步使用提前或滞后。
2条答案
按热度按时间i86rm4rw1#
下面是如何使用窗口函数
LAG()
和LEAD()
来实现:字符串
测试结果:
型
说明:
generate_series
生成两个日期之间的范围end_value
。start_value
。Demo here
tzdcorbm2#
您可以将
table2
与前一个table2
和table1
以及下一个table2
和table1
连接起来,确保两者之间没有任何东西(这就是为什么我们使用 *_no_between表进行连接,并通过 *_no_between表为空值进行过滤),然后通过case
-when
确定正确的值。字符串