如何在postgres中查询最近更新日期的同类别AVG值?

Posted

技术标签:

【中文标题】如何在postgres中查询最近更新日期的同类别AVG值?【英文标题】:How to query the same categories AVG value of recently updated date in postgres? 【发布时间】:2020-11-29 22:17:29 【问题描述】:

是否可以在 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
-----------------------------

【问题讨论】:

请定义“最近更新” 在最后一天?在最后一周?上个月? 我迷路了。第 3 类在哪里? 【参考方案1】:

如果您想要最近日期的平均价格,那么您可以使用:

select n.category, avg(p.price)
from name n join
     price p
     on p.name_id = n.id
where p.updated_at = (select max(p2.updated_at) from price)
group by n.category;

这似乎接近您的要求。

【讨论】:

我认为aggregate functions (MAX) 不允许出现在WHERE 子句中。 @upadhyas:它没有在 WHERE 子句中使用它在 WHERE 子句中使用的子查询的 SELECT 列表中使用。【参考方案2】:

您可以使用distinct on 获取每个name_id 的最新price 行,然后加入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

【讨论】:

以上是关于如何在postgres中查询最近更新日期的同类别AVG值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 postgres 中使用“更新跳过锁定”而不锁定查询中使用的所有表中的行?

比较两个日期分区上的同一行

MYSQL 查询慢 SELECT DISTINCT

如何计算 Postgres 中两个日期之间除星期日以外的天数?

如何在 Postgres 函数中检索多个结果行?

在 Postgres JSON 数组中查询