公平警告:我是使用SQL的新手。我是通过AQT或SQL Developer在Oracle服务器上完成的。
由于我无法思考或搜索答案,我把自己放在你能干的手中......
我想将表A(高质量数据)中的数据与表B中的数据(新数据)结合起来,这样只有当日期戳晚于表A中可用的日期时,才包括B中的条目。 / p>
两个表都包含来自多个实体的条目,最新的日期戳随这些实体而变化。
1月4日,桌子看起来像是:
A____________________________ B_____________________________
entity date type value entity date type value
X 1.jan 1 1 X 1.jan 1 2
X 1.jan 0 1 X 1.jan 0 2
X 2.jan 1 1 X 2.jan 1 2
Y 1.jan 1 1 (new entry)X 3.jan 1 1
Y 3.jan 1 1 Y 1.jan 1 2
Y 3.jan 1 2
(new entry)Y 4.jan 1 1
我尝试了一些代码,希望能澄清我的需求:
WITH
AA AS
(SELECT entity, date, SUM(value)
FROM table_A
GROUP BY
entity,
date),
BB AS
(SELECT entity, date, SUM(value)
FROM table_B
WHERE date > ALL (SELECT date FROM AA)
GROUP BY
entity,
date
)
SELECT * FROM (SELECT * FROM AA UNION ALL SELECT * FROM BB)
现在,如果WHERE date > ALL (SELECT date FROM AA)
单独为每个实体工作,我认为有我需要的。
也就是说,对于每个实体,我想要所有来自A的条目,只有来自B的新条目。
由于表A中的数据经常与B的数据不同(值经常被更正)我不认为我可以使用类似:table A UNION ALL (table B MINUS table A)
的内容?
由于
答案 0 :(得分:1)
基本上,您正在寻找BB中不存在的条目。当您执行date > ALL (SELECT date FROM AA)
时,这不会考虑相关实体,您将无法获得正确的记录。
另一种方法是使用JOIN
并使用AA过滤掉所有匹配的条目。
如下所示。
WITH
AA AS
(SELECT entity, date, SUM(value)
FROM table_A
GROUP BY
entity,
date),
BB AS
(SELECT entity, date, SUM(value)
FROM table_B
LEFT OUTER JOIN AA
ON AA.entity = BB.entity
AND AA.DATE = BB.date
WHERE AA.date == null
GROUP BY
entity,
date
)
SELECT * FROM (SELECT * FROM AA UNION ALL SELECT * FROM BB)
答案 1 :(得分:0)
使用UNION
代替UNION ALL
,它会删除重复的记录
SELECT * FROM (
SELECT *
FROM AA
UNION
SELECT *
FROM BB )
答案 2 :(得分:0)
我发现你的问题令人困惑,因为我不知道聚合的来源。
从table_b
获取较新行的基本思路使用where
子句中的条件,如下所示:
select . . .
from table_a a
union all
select . . .
from table_b b
where b.date > (select max(a.date) from a where a.entity = b.entity);
当然,您可以在您的CTE上运行此操作,如果这些是您真正希望合并的那些。