我正在尝试运行一个查询,该查询返回不同的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;
答案 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);