我有一个Postgresql数据库,我无法正确查询,即使这似乎是一个常见问题。
我的表格如下:
CREATE TABLE orders (
account_id INTEGER,
order_id INTEGER,
ts TIMESTAMP DEFAULT NOW()
)
每次有新订单时,我都会使用它来关联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 :(得分: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