PostgreSQL - 从连接表中选择聚合列并使用它来求和

Posted

技术标签:

【中文标题】PostgreSQL - 从连接表中选择聚合列并使用它来求和【英文标题】:PostgreSQL - select aggregated column from joined table and use it to sum 【发布时间】:2021-09-07 15:21:41 【问题描述】:

我想选择从三个表中聚合的字段,并为帖子输出三个字段,postIdcalculatedRatecount,我试过但没有用

目前我有这个示例查询只得到countpostId

select
    mr.count,
    mr.postId
from
    (
        select
            "m"."postId" as postId,
            count("m"."postId") as count
        from
            "Rating" r
        left join "Messenger" m on
            "r"."id" = "m"."ratingId"
        group by
            "m"."postId"
    ) mr
group by
    mr.postId,
    mr.count

Messenger(帖子和评级的映射表)

id postId ratingId
1 1 4
2 1 5
3 2 6

发帖

id title
1 post one
2 post two

评分

id a b
4 5.0 5.0
5 3.0 3.0
6 2.0 4.0

预期结果(calculatedRate = 同一帖子 id 内的平均值((rating.a + rating.b)/ 2))

id postId calculatedRate count
1 1 4.0 2
2 2 3.0 1

【问题讨论】:

【参考方案1】:

我不确定我是否得到了你要找的东西,但如果你想要每个 MESSENGER.IDCOUNTCALCULATEDRATE,那么下面应该这样做

SELECT 
MESSENGER.ID,
POST.ID POSTID, 
COUNT(*) NR_RATINGS,
(RATING.A + RATING.B)/2 CALCULATEDRATE
FROM 
RATING JOIN MESSENGER ON RATING.ID = MESSENGER.RATINGID
JOIN POST ON MESSENGER.POSTID=POST.ID

编辑:如果您想要平均邮寄,您可以通过以下方式实现这一目标

SELECT 
POST.ID POSTID, 
COUNT(*) NR_RATINGS,
avg((RATING.A + RATING.B)/2) CALCULATEDRATE
FROM 
RATING JOIN MESSENGER ON RATING.ID = MESSENGER.RATINGID
JOIN POST ON MESSENGER.POSTID=POST.ID
GROUP BY POST.ID

【讨论】:

感谢您的快速回复,实际上我希望每个帖子都有countcalculatedRate 我编辑了原始帖子以添加聚合

以上是关于PostgreSQL - 从连接表中选择聚合列并使用它来求和的主要内容,如果未能解决你的问题,请参考以下文章

如何从多个表中选择列并在 yii 框架中显示

postgreSQL 选择聚合函数中未使用的附加列

如何在所有表中查找特定列并在 PostgreSQL 中修改该列的值

如何从具有聚合函数的连接表中选择属性?

如何从表中选择所有列并计数?

从 mySQL 表中选择一列并检查验证