基于一行选择多个非聚合列的distinct

carvr3hs  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(301)

我正在尝试运行一个返回不同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;
wztqucjr

wztqucjr1#

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

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

wkftcu5l2#

需要关联子查询:

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() 相反。

相关问题