基于一行并选择了多个非聚合列而不同

时间:2018-10-26 16:04:09

标签: mysql sql database

我正在尝试运行一个查询,该查询返回不同的AddressID。

要为每个AddressID重新调整的行应该是具有最新ReadDate的行。

我还想从给定记录的(非聚合)列PhoneNumber,SomeCode和Country中返回值。

这里有类似的问题要问,但似乎没有什么适合我的确切情况。我尝试了不同的子查询并使其他列聚合,但似乎无法获得想要的结果。

说出查询的基础,例如:

select cr.AddressID, cr.ReadDate, in.PhoneNumber, in.SomeCode, in.Country 
from CustomerReadings cr, in.CustomerInfo
where cr.AddressID = in.AddressID

例如,如果我有一个看起来像这样的表:

AddressID     ReadDate       PhoneNumber    SomeCode    Country
1005          01/01/1997     5556565        GHS         Canada
1005          05/06/2006     5556753        ROT         USA
1005          08/12/2018     5552345        JKR         USA
2007          02/05/2012     5558746        MSC         Canada
2007          12/07/2018     5552345        RRE         France
4000          03/01/1999     5552345        RRE         France
4000          09/05/2007     5551243        MSR         USA

我希望查询结果如下所示:

AddressID     ReadDate       PhoneNumber    SomeCode    Country
1005          08/12/2018     5552345        JKR         USA
2007          12/07/2018     5552345        RRE         France
4000          09/05/2007     5551243        MSR         USA

如果不清楚,请告诉我,我将相应地更新我的问题。


对于您在答案示例中使用的1个表,该代码有效。

但是当我引入另一个表时,我不再仅获得一个不同的AddressID,例如:

select (or select distinct)
    cr.AddressID, cr.ReadDate, in.PhoneNumber, in.SomeCode, in.Country 
from
    CustomerReadings cr,
    CustomerInfo in
where
    cr.AddressID = in.AddressID
    and cr.ReadDate =
        (select max(cr2.ReadDate)
        from CustomerReadings cr2
        where cr2.AddressID = cr.AddressID)
order by
    2 desc,
    1;

2 个答案:

答案 0 :(得分:1)

您需要相关的子查询:

select t.*
from table t
where readdate = (select max(t1.readdate) from table t1 where t1.addressid = t.addressid);

如果您使用的是最新版本的MySQL,那么row_number()会有所帮助:

select t.*
from (select t.*,
             row_number() over (partition by addressid order by readdate desc) as seq
      from table t
     ) t
where seq = 1;

但是,如果readdate具有联系,那么row_number()将不再有助​​于使用dense_rank()

答案 1 :(得分:1)

应该有非常相似的问题。我使用了相关子查询:

select t.*
from t
where t.readdate = (select max(t2.readdate) from t t2 where t2.addressid = t.addressid);