Нужны значения из последних строк для нескольких записей - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть следующее:

UserID    SomeValue     DateUpdated
------------------------------------
1         263           2019-09-07
2         abc           2019-09-10
1         123           2019-09-10
2         234           2019-09-11
1         573           2019-09-20

Мне нужен запрос, который вернет отдельный идентификатор пользователя, самое последнее значение DateUpdated и соответствующее значение SomeValue для самой последней записи.

Я пробовал внешнее объединение для подзапроса той же таблицы.Не дал ожидаемых результатов.

SELECT B.UserID, B.SomeValue, B.DateUpdated 
FROM thetable B
LEFT OUTER JOIN 
(SELECT UserID, MAX(DateUpdated) AS DateUpdated 
 FROM thetable GROUP BY UserID) x
ON x.UserID = B.UserID AND x.DateUpdated = B.DateUpdated

Но это возвращает намного больше, чем ожидалось.

Из приведенного выше примера данных я бы ожидал получить:

UserID    SomeValue     DateUpdated
------------------------------------
2         234           2019-09-11
1         573           2019-09-20

В моей производственной таблице:У меня есть 3670108 записей.Внешнее соединение вернуло 3 669 774, но в таблице только 1 182 525 различных идентификаторов пользователей.Поэтому я ожидаю, что результаты будут 1 182 525 строк.

Любая помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Коррелированный подзапрос часто имеет очень хорошую производительность для этой проблемы:

SELECT B.*
FROM thetable B
WHERE B.DateUpdated = (SELECT MAX(B2.DateUpdated)
                       FROM thetable B2
                       WHERE B2.UserID = B.UserID 
                      );

Для производительности требуется индекс на thetable(UserId, DateUpdated).

0 голосов
/ 25 сентября 2019

С row_number():

select userid, somevalue, dateupdated
from (
  select *, row_number() over (partition by userid order by dateupdated desc) rn
  from thetable
) t
where rn = 1

Или с НЕ СУЩЕСТВУЮЩИМ:

select t.* from thetable t
where not exists (
  select 1 from thetable
  where userid = t.userid and dateupdated > t.dateupdated 
)

См. Демонстрационную версию .Результаты:

> userid | somevalue | dateupdated        
> -----: | :-------- | :----------
>      1 | 573       | 2019-09-20 
>      2 | 234       | 2019-09-11 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...