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

DB2 JOIN, UNION, and pull max value from each group

我在解决 DB2 问题的道路上遇到了困难。我有三个 table 看起来像这样...

PARENT

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

最终,我需要从每个 parent id 的任一 table 中找到最大日期。我的想法是 UNION 两个 SELECT,每个都被连接到 PARENT,但我完全不知道如何只为每个 parent 拉回一行,其中包含来自其中一个的最大日期TABLE1 或 TABLE2 像这样:

One: 2015-12-15
Two: 2015-10-01
Three: 2015-08-15

如果有人能提供一些指导,我将不胜感激。

一种方法是使用 union all,然后进行聚合。下面的代码做了一个改动,即预先聚合每个 table:

上的结果
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;
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 标签以获得 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

有一个函数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