如何在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 中使用“更新跳过锁定”而不锁定查询中使用的所有表中的行?