2016-07-14 1 views
3

У меня есть база данных Postgresql, и у меня возникли проблемы с правильной мой запрос, хотя это кажется общей проблемой.Получить последнюю запись от каждого пользователя в базе данных

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

CREATE TABLE orders (
    account_id INTEGER, 
    order_id  INTEGER, 
    ts   TIMESTAMP DEFAULT NOW() 
) 

Everytime есть новый порядок, я использую его, чтобы связать account_id и order_id.

Теперь моя проблема в том, что я хочу получить список с последним заказом (просмотрев ts) для каждой учетной записи.

Например, если мои данные:

account_id order_id   ts 
     5   178  July 1 
     5   129  July 6 
     4   190  July 1 
     4   181  July 9 
     3   348  July 1 
     3   578  July 4 
     3   198  July 1 
     3   270  July 12 

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

account_id order_id   ts 
     5   129  July 6 
     4   181  July 9 
     3   270  July 12 

Я попытался GROUP BY account_id, и Я могу использовать это, чтобы получить MAX(ts) для каждой учетной записи, но тогда у меня нет способа получить связанный order_id. Я также пробовал подзапросы, но я просто не могу понять это правильно.

Спасибо!

+0

У вас должен быть первичный ключ, поэтому используйте 'LIMIT 1' и'ORDER BY id DESC '. Он меняет порядок и ограничивает его 1 (поэтому самый высокий id - это первый результат, предел тогда принимает только 1 результат). –

+0

Попробуйте найти здесь: http://stackoverflow.com/questions/331367/sql-statement-help-select-latest-order-for-each-customer –

+0

@ Rajat Мне не нужна только одна строка, мне нужна строка для каждого account_id. – gattoo

ответ

3
select distinct on (account_id) * 
from orders 
order by account_id, ts desc 

https://www.postgresql.org/docs/current/static/sql-select.html#SQL-DISTINCT:

SELECT DISTINCT ON (выражение [, ...]) сохраняет только первую строку из каждого набора строк, где данные выражения оцениваются равными. Выражения DISTINCT ON интерпретируются с использованием тех же правил, что и для ORDER BY (см. Выше). Обратите внимание, что «первая строка» каждого набора непредсказуема, если только ORDER BY не используется, чтобы гарантировать, что первая строка появится первой.

+0

Отлично! Прекрасно работает! Благодаря! Я даже использовал DISTINCT раньше, но не знал о ключе ON. – gattoo

+1

Просто примечание: очевидно, 'DISTINCT ON (выражение)' - вещь Postgresql. Это не стандартный SQL. Тем не менее, лучший ответ, поскольку я использую Postgresql. – gattoo

2

Функция row_number() окно может помочь:

select account_id, order_id, ts 
    from (select account_id, order_id, ts, 
       row_number() over(partition by account_id order by ts desc) as rn 
      from tbl) t 
where rn = 1