Различается на основе одной строки с выбранными несколькими неагрегированными столбцами - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь выполнить запрос, который возвращает разные 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 голосов
/ 26 октября 2018

Должны быть вопросы, которые очень похожи. Я использую коррелированный подзапрос:

select t.*
from t
where t.readdate = (select max(t2.readdate) from t t2 where t2.addressid = t.addressid);
0 голосов
/ 26 октября 2018

Вам нужен коррелированный подзапрос:

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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...