繁体   English   中英

DB2 JOIN,UNION和从每个组中提取最大值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM