@Malkolm163

Как сформировать запрос к. postgresql?

Есть таблица keys с полями
id,
key,
issuat_at, timestamp даты выдачи ключа
user_login,
app_version,
device,
и другие поля, который в данном контексте значения не имеют
Каждый пользователь может получить несколько ключей (на разные device свой ключ)
нужно получить одним запросом такой список, в котором для каждого пользователя будет только одна строка, при этом та, в которой максимальное значение в issuat_at
вот пример6569dd201e467945574809.png
  • Вопрос задан
  • 98 просмотров
Решения вопроса 2
iMedved2009
@iMedved2009
Не люблю людей
0. Мне тут указали что нужен не только ключ - а всю строку - тогда задача называется groupwise maximum
select 
keys.*
from keys.*
join 
    (select max(issued_at) as issued_at, user_login from keys group by user_login) as last 
on 
last.user_login = keys.user_login and last.issued_at = keys.issued_at


1. В лоб.
select
    "user_login",
     (select key "user_login"  from keys as last where keys.id = last.id order by issued_at desc limit 1) as key
from keys
group by "user_login"

2. Оконные функции
SELECT 
    user_login,
    LAST_VALUE(key) OVER(ORDER BY issued_at desc) as last_key
FROM 
    keys
group by "user_login";


3. Через костыли
SELECT 
    user_login,
    ARRAY_AGG(key ORDER BY issued_at desc)[0]
FROM 
    keys
group by "user_login";
Ответ написан
rozhnev
@rozhnev
Fullstack programmer, DBA, медленно, дорого
Стандартно такая задача решается про помощи функции row_number и CTE (табличного выражения)
with d as (
    select 
        *,
        row_number() over (partition by user_login order by issued_at) rn
    from tbl
) select * from d where rn = 1;


Проверить онлайн: https://sqlize.online/sql/psql15/5cad12f7a96a07e91...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы