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
。
我在解决 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
。