【发布时间】:2020-03-08 21:49:05
【问题描述】:
有两个表:
Table1(id, p1, p2, date_from, date_to):
(1, 'z', 55, '01.05.2010 12:30:20', '17.05.2010 13:10:14'),
(1, 'c', null, '17.05.2010 13:10:15', '18.01.2010 04:13:15'),
(1, 'c', 25, '18.01.2010 04:13:16', '01.01.9999 00:00:00');
Table2(id, p3, date_from, date_to):
(1, 15, '01.04.2010 12:30:20', '02.05.2010 13:10:14'),
(1, 35, '02.05.2010 13:10:15', '01.01.9999 00:00:00');
在合并2个表时,必须有字段包含每个参数的更改历史记录。那就是:
选择(id,p1,p2,p3,date_from,date_to):
(1, null, null, 10, '01.04.2010 12:30:20', '01.05.2010 12:30:19'),
(1, 'z', 55, 15, '01.05.2010 12:30:20', '02.05.2010 13:10:14'),
(1, 'z', 55, 35, '02.05.2010 13:10:15', '17.05.2010 13:10:14'),
(1, 'c', null, 35, '17.05.2010 13:10:15', '18.01.2010 04:13:15'),
(1, 'c', 25, 35, '18.01.2010 04:13:16', '01.01.9999 00:00:00');
如果两个表中的记录在时间上(或部分时间)不重叠,则应输出 null。
到目前为止我已经完成了:
select
a.id,
case
when a.date_to between b.date_from and b.date_to
or a.date_from between b.date_from and b.date_to
then p1
end as p1,
case
when a.date_to between b.date_from and b.date_to
or a.date_from between b.date_from and b.date_to
then p2
end as p2,
p3,
a.date_from as af,
b.date_from as bf,
a.date_to as at,
b.date_to as bt
from
Table1 a
left join Table2 b
on
a.id=b.id
and (b.date_from between a.date_from and a.date_to
or a.date_from between b.date_from and b.date_to)
【问题讨论】:
-
Table1第 2 行中的样本数据的to日期早于from日期... -
您的预期结果在第一行中
p3的值也有误。
标签: sql database postgresql