我正在尝试编写两个表中的连接,其中左表中的日期值落入右表中的时间段。因此,举例来说,如果我有:用历史时间表连接表
TABLE A TABLE B
ID TIMESTMP ID TIMESMTP VALUE
1 8/31/2012 2:00 PM 1 8/30/2012 4:00 AM A
2 8/29/2012 3:00 PM 1 8/31/2012 1:00 PM B
3 7/04/2012 5:00 AM 1 8/31/2012 3:00 PM C
2 8/20/2012 1:00 PM A
结果应该是:
TABLE C
ID TIMESTMP VALUE
1 8/31/2012 2:00 PM B
2 8/29/2012 3:00 PM A
3 7/04/2012 5:00 AM null
我想找到表B中与最大时间戳这仍然是<表A中的时间戳相对应的记录如果没有匹配的id(外部连接),或者A中的时间戳B中没有时间戳,它应该返回null。
谢谢!
UPDATE
这里是我使用铅()去的建议由戈登·利诺夫解决方案:
SELECT b.value, a.*
FROM table_a a
LEFT OUTER JOIN (
SELECT id, timestmp,
lead(timestmp) over(PARTITION BY id ORDER BY timestmp) AS next_timestmp,
value FROM table_b
) b
ON a.id = b.id
AND (a.timestmp >= b.timestmp AND (a.timestmp < b.timestmp OR b.timestmp IS NULL))
我非常喜欢这个想法。我不知道lead()函数。超级方便。然而,当我使用这个连接时,它减少了我的结果集(即使我做了一个正确的外连接)。 – Paul
你应该尝试一个左外连接。 。 。一个左外连接到B.这样,你会保持在A中的一切。 –
对不起,我的大脑向后。你是对的,左边的外部连接给了我我所追求的。我最终做了一点改变,但lead()函数是关键。 – Paul