DB2 JOIN,UNION和每个组的pull max值

时间:2015-11-19 20:28:39

标签: sql db2 union

我很难绕过解决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

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

4 个答案:

答案 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