一尘不染

从按多列分组的行组中选择具有最大值的行(PSQL)

sql

我有一张交易数据表,这些数据是对未来的预测。因此,随着时间的流逝和重新发送的预测变得更加准确,可以多次读取由相同日期,类型,位置和产品标识的相同预测。

我想创建一个查询,将相同类型,相同位置,产品和日期的交易分组,然后从这些分组中仅选择具有最新时间戳的交易。

该表现在有成千上万的行,随着时间的流逝,数百万行,因此,一个合理有效的解决方案将不胜感激:)

表格示例:

date    |  location_code   | product_code  | quantity |   type   | updated_at 
------------+------------------+---------------+----------+----------+------------
2013-02-04 | ABC | 123 |  -26.421 | TRANSFER | 2013-01-12
2013-02-07 | ABC | 123 |    -48.1 | SALE | 2013-01-10
2013-02-06 | BCD | 234 |  -58.107 | SALE | 2013-01-11
2013-02-06 | BCD | 234 |      -60 | SALE | 2013-01-10
2013-02-04 | ABC | 123 |   -6.727 | TRANSFER | 2013-01-10

理想的结果:

date    |  location_code   | product_code  | quantity |   type   | updated_at 
------------+------------------+---------------+----------+----------+------------
2013-02-04 | ABC | 123 |  -26.421 | TRANSFER | 2013-01-12
2013-02-07 | ABC | 123 |    -48.1 | SALE | 2013-01-10
2013-02-06 | BCD | 234 |  -58.107 | SALE | 2013-01-11

我尝试例如:

SELECT t.date, t.location_code, t.product_code, t.quantity, t.type, t.updated_at
FROM transactions t
INNER JOIN
(
   SELECT MAX(updated_at) as max_updated_at
   FROM transactions
   GROUP BY product_code, location_code, type, date
) s on t.updated_at=max_updated_at;

但这似乎需要很长时间,而且似乎行不通。

感谢您的帮助!


阅读 133

收藏
2021-05-23

共1个答案

一尘不染

select distinct on ("date", location_code, product_code, type)
    "date",
    location_code,
    product_code,
    quantity,
    type,
    updated_at
from transactions t
order by t."date", t.location_code, t.product_code, t.type, t.updated_at desc
2021-05-23