[英]DB2 JOIN, UNION, and pull max value from each group
在解决DB2中的问题的道路上,我很难过。 我有三个看起来像这样的桌子...
父母
id | label
--------------
1 | One
2 | Two
3 | Three
表格1
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
表2
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进行选择,每个SELECT都加入到PARENT中,但是我完全不知道如何仅为每个父级从TABLE1或TABLE2中拉出包含最大日期的单个行,如下所示:
One: 2015-12-15
Two: 2015-10-01
Three: 2015-08-15
如果有人可以提供一些指导,我将非常感谢。
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
您走在正确的轨道上。 在子查询中使用并集,然后加入PARENT和GROUP BY标签以获取最大日期。
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
一种方法是先使用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;
有一个函数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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.