如何在GROUP BY查询中聚合非聚合值?

时间:2017-11-08 11:04:56

标签: mysql sql group-by

我有一张满是重复的表。我正在尝试转换它们,以便我可以在两个字段中添加唯一约束(例如identifier1identifier2)。

我想将这些副本“折叠”成单个记录,但我的记录中包含不同的字符串。我想在这些情况下保持最后的感觉(保持最高ID并丢弃其余部分)。

例如,我可以使用startDate汇总下面的MIN() - 但我如何才能获得最新的location

    id | identifier1 | identifier2 | location   | startDate
    1  | alice       | 0001        | ambridge   | 2016-01-01
    2  | bob         | 1312        | brigadoon  | 2017-01-01
    3  | alice       | 0001        | brigadoon  | 2017-05-01
    4  | bob         | 9999        | brigadoon  | 2015-01-01
    5  | celeste     | 1234        | cittegazze | 2011-01-01

    id | identifier1 | identifier2 | location   | startDate
    6  | alice       | 0001        | brigadoon  | 2016-01-01
    7  | bob         | 1312        | brigadoon  | 2017-01-01
    8  | bob         | 9999        | brigadoon  | 2015-01-01
    9  | celeste     | 1234        | cittegazze | 2011-01-01

2 个答案:

答案 0 :(得分:0)

试试这个:

select A.identifier1, A.identifier2, A.startDate, B.Location from (
    select identifier1,
           identifier2,
           MIN(startDate) AS startDate
    from TABLE_NAME
    group by identifier1, identifier2
) AS A JOIN TABLE_NAME AS B
ON (A.identifier1 = B.identifier1 and A.identifier2 = B.identifier2 and A.startDate = B.startDate)

答案 1 :(得分:0)

我认为更有效的查询就是:

select t.*
from t
where t.startDate = (select max(t2.startDate)
                     from t t2
                     where t2.identifier1 = t.identifier1 and t2.identifier2 = t.identifier2
                    );

这种方法的优点是它可以利用(identifier1, identifier2, startDate)上的索引。