我有一张交易数据表,这是对未来的预测。因此,相同的日期,类型,位置和产品所确定的相同预测可以多次读取,因为随着时间的推移和重新预测变得更加准确。
我想创建一个查询,该查询将对相同类型和相同位置,产品和日期的事务进行分组,然后从这些组中仅选择具有最新更新时间戳的事务。
该表现在有数十万行,随着时间的推移,数百万行,所以一个合理有效的解决方案将不胜感激:)
示例表:
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;
但这似乎需要很长时间才能起作用。
谢谢你的帮助!
答案 0 :(得分:3)
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
答案 1 :(得分:2)
这可能比使用派生表
的连接更有效select *
from (
select date,
location_code,
product_code,
quantity,
type,
updated_at,
max(updated_at) over (partition by product_code, location_code, type, date) as max_updated
from transactions
) t
where updated_at = max_updated;
答案 2 :(得分:1)
谢谢Dan Bracuk!
这是正确的查询:
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, product_code prod, location_code loc, type typ, date dat
FROM transactions
GROUP BY product_code, location_code, type, date
) s ON t.updated_at=max_updated_at AND t.location_code=loc AND t.product_code=prod AND t.type=typ AND t.date=dat;