获取数据库中每个用户的最后一个条目

时间:2016-07-14 18:33:34

标签: sql postgresql greatest-n-per-group

我有一个Postgresql数据库,我无法正确查询,即使这似乎是一个常见问题。

我的表格如下:

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

每次有新订单时,我都会使用它来关联account_idorder_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。我也尝试了子查询,但我似乎无法做到正确。

谢谢!

2 个答案:

答案 0 :(得分: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(expression [,...])仅保留给定表达式求值的每组行的第一行。使用与ORDER BY相同的规则解释DISTINCT ON表达式(参见上文)。请注意,除非使用ORDER BY确保首先显示所需的行,否则每个集合的“第一行”都是不可预测的。

答案 1 :(得分: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