我有两个具有以下结构的表。表1有一个密钥(ID,ASOFDATE),表2有一个密钥(ID)。我想获得一个表,表3的键为表1。我正在使用ORACLE数据库。有没有办法在SQL中做到这一点?
我得到它一个asofdate的工作,但是我不知道如何对所有asofdate进行概括。
对于一个截止日期:
select ID, VALUE, ASOFDATE, max(ASOFDATE) as NEW_ASOFDATE from (
select * from TABLE 1
where ASOFDATE = '09.03.2016'
union
select * from TABLE 2
where ASOFDATE <= '09.03.2016'
)
这里是我想做的一个具体例子。
Table 1
ID VALUE ASOFDATE
1234 876 10.03.2016
2345 98 10.03.2016
3456 643 10.03.2016
1234 345 09.03.2016
2345 32 09.03.2016
3456 56 09.03.2016
1234 123 08.03.2016
2345 78 08.03.2016
3456 435 08.03.2016
Table 2
ID VALUE ASOFDATE
9876 961 10.03.2016
8765 467 09.03.2016
7654 234 08.03.2016
6543 56 07.03.2016
5432 7 06.03.2016
Table 3
ID VALUE ASOFDATE NEW_ASOFDATE
1234 876 10.03.2016 10.03.2016
2345 98 10.03.2016 10.03.2016
3456 643 10.03.2016 10.03.2016
9876 961 10.03.2016 10.03.2016
8765 467 09.03.2016 10.03.2016
7654 234 08.03.2016 10.03.2016
6543 56 07.03.2016 10.03.2016
5432 7 06.03.2016 10.03.2016
1234 345 09.03.2016 09.03.2016
2345 32 09.03.2016 09.03.2016
3456 56 09.03.2016 09.03.2016
8765 467 09.03.2016 09.03.2016
7654 234 08.03.2016 09.03.2016
6543 56 07.03.2016 09.03.2016
5432 7 06.03.2016 09.03.2016
1234 123 08.03.2016 08.03.2016
2345 78 08.03.2016 08.03.2016
3456 435 08.03.2016 08.03.2016
7654 234 08.03.2016 08.03.2016
6543 56 07.03.2016 08.03.2016
5432 7 06.03.2016 08.03.2016
表2的每个条目在表1的每个日期被重复,但是每次(每个日期的每个)仅满足条件Table2.ASOFDATE <= TABLE1的表2的条目进入表3。请遵循表3。在我的示例中,ID = 8765的表2中的条目发生了什么。它两次出现在表3中。当NEW_ASOFDATE为'08 .03.2016'时,它不会出现。
我认为这可以解决问题
SELECT * FROM
(
SELECT DISTINCT T2ID AS ID, T2VAL AS VAL, T2DATE AS DT, T1DATE AS MAXDT
FROM
(
-- WATCH OUT : Cartesian product !
SELECT T1.ID as T1ID, T1.Value AS T1VAL, T1.ASOFDATE AS T1DATE, T2.ID AS T2ID, T2.Value AS T2VAL, T2.ASOFDATE AS T2DATE
FROM Table1 T1, Table2 T2
)
UNION
SELECT ID, VALUE AS VAL, ASOFDATE AS DT, ASOFDATE AS MAXDT FROM Table1
)
WHERE DT <= MAXDT
ORDER BY MAXDT DESC , DT DESC, ID ASC
请注意,我无法在Oracle下对其进行测试,因为SQLfiddle Oracle再次损坏了,我在Access中对其进行了测试,并且可以正常工作。我已经针对Oracle SQL对其进行了修改,但是我可能省略了一些内容,因此您可能需要对其进行一些调整。
结果:
ID VAL DT MAXDT
1234 876 10.03.2016 10.03.2016
2345 98 10.03.2016 10.03.2016
3456 643 10.03.2016 10.03.2016
9876 961 10.03.2016 10.03.2016
8765 467 09.03.2016 10.03.2016
7654 234 08.03.2016 10.03.2016
6543 56 07.03.2016 10.03.2016
5432 7 06.03.2016 10.03.2016
1234 345 09.03.2016 09.03.2016
2345 32 09.03.2016 09.03.2016
3456 56 09.03.2016 09.03.2016
8765 467 09.03.2016 09.03.2016
7654 234 08.03.2016 09.03.2016
6543 56 07.03.2016 09.03.2016
5432 7 06.03.2016 09.03.2016
1234 123 08.03.2016 08.03.2016
2345 78 08.03.2016 08.03.2016
3456 435 08.03.2016 08.03.2016
7654 234 08.03.2016 08.03.2016
6543 56 07.03.2016 08.03.2016
5432 7 06.03.2016 08.03.2016
更重要的注意事项:这样做CROSS JOIN
会产生笛卡尔积,因此如果您的桌子很大,则不适合
好玩
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句