首页 > 解决方案 > 如何在postgres中查询最近更新日期的同类别AVG值?

问题描述

是否可以在 Postgres 的单个查询中执行以下操作?

表:名称

-------------------------------------
| id    | unique_name   | category  |
-------------------------------------
| 1     | A             | One       |
| 2     | B             | One       |
| 3     | C             | One       |
| 4     | D             | Two       |
| 5     | E             | Two       |
| 6     | F             | Two       |
| 7     | G             | Three     |
| 8     | H             | Three     |
-------------------------------------

表:价格

-----------------------------------------------------
| id    | name_id       | amount    | updated_date  |
-----------------------------------------------------
| 1     | 1             | 4.3       | 20-06-2020    |
| 2     | 2             | 2.3       | 20-06-2020    |
| 3     | 2             | 2.4       | 18-06-2020    |
| 4     | 3             | 4.4       | 20-06-2020    |
| 5     | 3             | 6.3       | 15-06-2020    |
| 6     | 4             | 0.2       | 10-06-2020    |
| 7     | 4             | 0.3       | 15-06-2020    |
| 8     | 4             | 7.4       | 20-06-2020    |
| 9     | 5             | 3.4       | 20-06-2020    |
-----------------------------------------------------

我有一个像上面这样的表结构。

我想要最近更新的同一类别的平均数量。

如下所示:

-----------------------------
| avg           | category  |
-----------------------------
| 3.66          | One       |     (4.3 + 2.3 + 4.4) / 3
| 5.4           | Two       |     (7.4 + 3.4) / 2
-----------------------------

标签: sqlpostgresqljoinaveragegreatest-n-per-group

解决方案


您可以使用distinct on获取最新的price每行name_id,然后加入name表并聚合:

select n.category, avg(p.price) avg_price
from name n
inner join (
    select distinct on(name_id) p.*
    from price p
    order by name_id, updated_at desc
) p on p.name_id = n.id
group by n.category

推荐阅读