Извлечь строку с последним вхождением на основе нескольких идентификаторов - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь найти последнее сообщение для каждого пользователя за сеанс.Каждая строка сообщения имеет идентификатор пользователя и какой сеанс пользователя (с увеличением на 1 для каждого сеанса)

Моя таблица выглядит следующим образом:

user_id | timestamp                  | usermessage   | user_session_id

1       | 2019-08-28 14:50:39.150000 | hi            | 1
1       | 2019-08-28 14:50:40.150000 | goodbye       | 1
1       | 2019-09-01 10:50:39.150000 | hello again   | 2
1       | 2019-09-01 11:50:39.150000 | goodbye again | 2
2       | 2019-07-09 07:53:56.680000 | hello         | 1 
2       | 2019-07-10 09:23:16.100000 | hi there      | 2     

Я ищу, чтобы получить последнее сообщение(последняя отметка времени) каждого пользователя, отправленного за сеанс.Поэтому мой ожидаемый результат будет примерно таким:

user_id | timestamp                  | usermessage   | user_session_id
1       | 2019-08-28 14:50:40.150000 | goodbye       | 1
1       | 2019-09-01 11:50:39.150000 | goodbye again | 2
2       | 2019-07-09 07:53:56.680000 | hello         | 1 
2       | 2019-07-10 09:23:16.100000 | hi there      | 2       

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

В Postgres я бы порекомендовал distinct on:

select distinct on (user_id, user_session_id) t.*
from t
order by user_id, user_session_id, timestamp desc;

В Postgres это, как правило, самый эффективный метод для выполнения запросов такого типа.Для лучшей производительности вы хотите индекс на (user_id, user_session_id, timestamp desc).

1 голос
/ 26 сентября 2019

использование row_number()

select * from     
(select *,row_number() over(partition by user_id, user_session_id order by timestamp desc) rn
from table_name
) a where a.rn=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...