一对多加入聚合函数(Max)

时间:2016-04-19 02:08:38

标签: mysql aggregate-functions

我有两张桌子。

表1:

+---------+-------------+-------------+------------+
| Deal_ID | Stage_From  |  Stage_To   | ChangeDate |
+---------+-------------+-------------+------------+
|    1199 | incoming    | stage1      | 01-Dec-14  |
|    1199 | stage1      | incoming    | 05-Dec-14  |
|    1199 | incoming    | stage1      | 12-Dec-14  |
|    1080 | incoming    | unqualified | 06-Dec-14  |
|    1080 | unqualified | stage2      | 07-Dec-14  |

表2:

+---------+---------+------------+
| Lead_ID | Deal_ID | ChangeDate |
+---------+---------+------------+
|    2323 | null    | null       |
|    2324 | 1199    | 12-Dec-14  |
|    2325 | null    | null       |
|    2326 | null    | null       |
|    2327 | 1080    | null       |
+---------+---------+------------+

我想添加" ChangeDate"对于每个Deal_ID,其表2中的记录已从" Incoming"到" Stage1"。如果阶段从"传入"到" stage1"多次,我希望最大日期,即2014年12月12日,而不是2014年12月1日。

结果表应为:

 ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/../session'));
session_start();

我看了几个类似的问题,建议使用" Group_Concat",但我无法通过该方法达到我想要的效果。

非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

以下是查询:

SELECT 
T.Lead_ID,
T.Deal_ID,
DATE_FORMAT(TT.maxChangeDate,'%d-%b-%y') AS ChangeDate
FROM Table1 T
LEFT JOIN 
(

   SELECT 
     Deal_ID,
     MAX(ChangeDate) maxChangeDate
     FROM Table2
   WHERE Stage_From = 'incoming'
   AND Stage_To = 'stage1'
   GROUP BY Deal_ID ) TT
ON TT.Deal_ID = T.Deal_ID;

SQL FIDDLE DEMO

<强>输出:

Lead_ID Deal_ID ChangeDate
2323    (null)  (null)
2324    1199    12-Dec-14
2325    (null)  (null)
2326    (null)  (null)
2327    1080    (null)

<强>解释

让我们看一下以下查询(在上面的查询中TT块内)

   SELECT 
     Deal_ID,
     MAX(ChangeDate) maxChangeDate
     FROM Table2
   WHERE Stage_From = 'incoming'
   AND Stage_To = 'stage1'
   GROUP BY Deal_ID;

如果changeDateDeal_ID分别为incomingstage1,则此查询会获取每个Stage_From的最新Stage_To

因此,此查询返回以下结果:

Deal_ID    maxChangeDate
1199        2014-12-12

现在,如果您在 Table1 和此结果之间设置LEFT JOIN,那么您将在 Table1 条目中的每个条目中得到相应的maxChangeDateLead_ID and Deal_ID之后。