postgres加入最大日期

时间:2016-04-18 18:10:45

标签: sql postgresql inner-join aggregate

我需要构建一个联接,它会为每个产品提供 最新 价格。为了示例的目的,我大大简化了表结构,每个表的行数将是数百万。我之前对此的研究并不是非常有效。

products

prices

3 个答案:

答案 0 :(得分:1)

最简单的方法是使用row_number函数。

select p.name,t.amount as latest_price
from (select p.*, row_number() over(partition by product_id order by create_date desc) as rn 
      from prices p) t 
join products p on p.id = t.product_id
where rn = 1

答案 1 :(得分:1)

在PostgreSQL中,您可以尝试DISTINCT ON只按降序"createModel": function(modelName, callback) { app.models.modelName.create(self.modelName(), function(error, modelInstance) { if(!error){ callback(null, modelInstance.id); } }); } 顺序获取每个产品ID的第一行;

create_date

(当然,除了说明目的,你当然应该选择你需要的确切列)

答案 2 :(得分:0)

虽然 DISTINCT ON 的答案对我的实例有效,但我发现有一种更快的方法可以让我得到我需要的东西。

SELECT DISTINCT ON(u.id) u.id, (CAST(data AS JSON) ->> 'Finished') AS Finished, ee.post_value
    FROM users_user u
    JOIN events_event ee on u.id = ee.actor_id
    WHERE u.id > 20000
    ORDER BY u.id DESC, ee.time DESC
;

我的数据库需要大约 25 秒,而

SELECT u.id, (CAST(data AS JSON) ->> 'Finished') AS Finished, e.post_value
    FROM users_user u
    JOIN events_event e on u.id = e.actor_id
    LEFT JOIN events_event ee on ee.actor_id = e.actor_id AND ee.time > e.time
    WHERE u.id > 20000 AND ee.id IS NULL
    ORDER BY u.id DESC
;

大约需要 15 秒。