我有这样的表A。
id | eventtime
--------------
1 | 2020-05-01 10:00:12
2 | 2020-04-03 04:04:23
3 | 2020-06-01 00:01:00
表B
qid|id | timestamp | status
-------------------------------------
1 | 1 | 2020-04-03 01:00:00 | Y
2 | 1 | 2020-05-02 04:11:00 | N
3 | 2 | 2020-04-02 03:00:00 | Y
4 | 4 | 2020-06-01 01:00:00 | N
5 | 4 | 2020-06-03 01:00:00 | Y
我想加入这些表,但是当时间戳大于表A的事件时间时,它应该返回表'B的数据。
在表B中,
对于id 1,我有3行,但是我需要选择timestamp> tableA.eventtime
中的行所以2 | 1 | 2020-05-02 04:11:00 | N
对于ID 2,时间戳记值小于tableA的事件时间,因此请跳过该事件。
所以选定的行是2 | 1 | 2020-05-02 04:11:00 | N
对于ID 4,没有事件时间,实际上,表A上没有ID 4的行。因此,现在我需要为此传递默认时间戳。那就是2020-06-02 00:00:00
所以选定的行是5 | 4 | 2020-06-03 01:00:00 | Y
qid|id | timestamp | status
-------------------------------------
2 | 1 | 2020-05-02 04:11:00 | N
5 | 4 | 2020-06-03 01:00:00 | Y
在为此编写逻辑时被卡住了吗?有人可以帮我吗?
答案 0 :(得分:0)
我认为这可以满足您的需求
select b.*
from b left join
a
on a.id = b.id
where b.timestamp > coalesce(a.eventtime, '2020-06-02 00:00:00'::timestamp);
答案 1 :(得分:0)
您可以在查询中使用CASE语句。
SELECT B.*
FROM B LEFT JOIN A ON A.ID = B.ID
WHERE CASE
WHEN B.TIMESTAMP >
CASE
WHEN A.EVENTTIME IS NULL
THEN
TO_DATE ('20200602', 'YYYYMMDD')
WHEN A.EVENTTIME IS NOT NULL
THEN
A.EVENTTIME
END
THEN
1
ELSE
0
END = 1