我很难绕过解决DB2问题的路径。我有三张看起来像这样的桌子......
PARENT
id | label
--------------
1 | One
2 | Two
3 | Three
TABLE1
id | parentid | eventdate
-------------------------
1 | 1 | 2015-11-01
2 | 1 | 2015-12-01
3 | 2 | 2015-10-01
4 | 2 | 2015-09-01
5 | 3 | 2015-08-01
6 | 3 | 2015-07-01
TABLE2
id | parentid | eventdate
-------------------------
1 | 1 | 2015-11-15
2 | 1 | 2015-12-15
3 | 2 | 2015-07-15
4 | 2 | 2015-09-15
5 | 3 | 2015-08-15
6 | 3 | 2015-05-15
最终,我需要从每个父ID的任一表中找到最大日期。我的想法是给UNION两个SELECT,每个都是JOENT到PARENT,但我完全不知道如何只为TABLE1或TABLE2中的最大日期组成的每个父项拉回一行,如下所示:
One: 2015-12-15
Two: 2015-10-01
Three: 2015-08-15
如果有人能提供一些指导,我将非常感激。
答案 0 :(得分:2)
SELECT label,
CASE WHEN max(t1.eventdate) > max(t2.eventdate)
THEN max(t1.eventdate)
ELSE max(t2.eventdate)
END as eventdate
FROM PARENT p
JOIN TABLE1 t1
ON p.id = t1.id
JOIN TABLE2 t2
ON p.id = t2.id
GROUP BY p.label
答案 1 :(得分:2)
你走在正确的轨道上。在子查询中使用union,然后连接PARENT和GROUP BY标签以获取MAX日期。
SELECT label, MAX(eventdate) AS maxeventdate FROM (
SELECT parentid, eventdate FROM TABLE1
UNION ALL
SELECT parentid, eventdate FROM TABLE2)
JOIN PARENT ON (id = parentid)
GROUP BY label
答案 2 :(得分:1)
一种方法是使用union all
,然后使用聚合。以下是扭曲,即在每个表上预聚合结果:
select p.label, max(maxed) as max_eventdate
from ((select parentid, max(eventdate) as maxed
from table1
group by parentid
) union all
(select parentid, max(eventdate)
from table2
group by parentid
)
) t12 join
parent p
on t12.parentid = p.id
group by p.label;
答案 3 :(得分:1)
有一个函数GREATEST()
就是为了这个目的,所以你可以调整@JuanCarlosOropeza提出的解决方案:
SELECT label, GREATEST(max(t1.eventdate), max(t2.eventdate)) eventdate
FROM PARENT p
JOIN TABLE1 t1 ON p.id = t1.id
JOIN TABLE2 t2 ON ON p.id = t2.id
GROUP BY p.label
如果事件只出现在两个事件表中的一个中,您可能需要使用LEFT JOIN
。