SQL:将平均值与总体平均值进行比较

SQL:将平均值与总体平均值进行比较,sql,Sql,我有一张名为“评级”的桌子 ID RATING 1 5 1 2 2 5 3 1 3 4 3 4 我想找出每个餐厅(相同id)的平均评分,大于或等于整体平均评分(所有餐厅的平均评分总和) 例如,餐厅ID 1的平均值为3.5,餐厅ID 3的平均值为3。在这种情况下,总体平均值为3.5 因此,该表应该返回 ID RATING 1 3.5 2 5 到目前为止,我就是这样做的,但我不确定如何将其与总体

我有一张名为“评级”的桌子

ID    RATING
1       5
1       2
2       5
3       1
3       4
3       4
我想找出每个餐厅(相同id)的平均评分,大于或等于整体平均评分(所有餐厅的平均评分总和)

例如,餐厅ID 1的平均值为3.5,餐厅ID 3的平均值为3。在这种情况下,总体平均值为3.5 因此,该表应该返回

ID   RATING
1      3.5
2      5
到目前为止,我就是这样做的,但我不确定如何将其与总体平均水平进行比较

SELECT x.id, AVG(x.rating) AS average
FROM ratings
GROUP BY x.rid;

因此,这将返回一个表,其中包含每个餐厅ID的平均评分,但如何将其与评分的总平均值进行比较,而不进行硬编码?

使用
having
子句:

SELECT x.id, AVG(x.rating) AS average
FROM ratings x
GROUP BY x.rid
Having AVG(x.rating)>(select AVG(rating) from ratings);

使用
具有
子句:

SELECT x.id, AVG(x.rating) AS average
FROM ratings x
GROUP BY x.rid
Having AVG(x.rating)>(select AVG(rating) from ratings);

使用
具有
子句:

SELECT x.id, AVG(x.rating) AS average
FROM ratings x
GROUP BY x.rid
Having AVG(x.rating)>(select AVG(rating) from ratings);

使用
具有
子句:

SELECT x.id, AVG(x.rating) AS average
FROM ratings x
GROUP BY x.rid
Having AVG(x.rating)>(select AVG(rating) from ratings);

我倾向于使用窗口功能:

select r.*
from (select r.id, avg(rating*1.0)) as avgr,
             sum(sum(rating*1.0)) over () / sum(count(*)) over () as avgavg
      from ratings r
      group by r.id
     ) r
where avgr >= avgavg

我倾向于使用窗口功能:

select r.*
from (select r.id, avg(rating*1.0)) as avgr,
             sum(sum(rating*1.0)) over () / sum(count(*)) over () as avgavg
      from ratings r
      group by r.id
     ) r
where avgr >= avgavg

我倾向于使用窗口功能:

select r.*
from (select r.id, avg(rating*1.0)) as avgr,
             sum(sum(rating*1.0)) over () / sum(count(*)) over () as avgavg
      from ratings r
      group by r.id
     ) r
where avgr >= avgavg

我倾向于使用窗口功能:

select r.*
from (select r.id, avg(rating*1.0)) as avgr,
             sum(sum(rating*1.0)) over () / sum(count(*)) over () as avgavg
      from ratings r
      group by r.id
     ) r
where avgr >= avgavg

如果您希望所选id的平均值大于其他id的平均值,则必须首先获取平均值的平均值,以便您比较每个单独平均值的平均值不会被一个id所扭曲,因为一个id的报告评级要多得多,而我们的报告评级要少得多

e、 g.-id:1得到1000分1,id:2得到1分2,id:3得到一分3,id:4得到1分4。在这种情况下,如果只取所有评级的平均值,则略高于1(这将显示id 2、3和4的平均评级高于1.x。如果您首先对每个id的评级进行平均,则每个id的平均评级恰好等于其id。这些评级的平均值为2.5。这将表明只有id 3和4具有更高的平均值

SELECT id
,      rating
FROM   (
    SELECT x.id
    ,      AVERAGE(x.rating) AS rating
    FROM   ratings
    GROUP BY x.id
) avgRatings
WHERE  rating >= (SELECT AVERAGE(rating) FROM avgRatings)

如果您希望所选id的平均值大于其他id的平均值,则必须首先获取平均值的平均值,以便您比较每个单独平均值的平均值不会被一个id所扭曲,因为一个id的报告评级要多得多,而我们的报告评级要少得多

e、 g.-id:1得到1000分1,id:2得到1分2,id:3得到一分3,id:4得到1分4。在这种情况下,如果你只取所有评分的平均值,它略大于1(这将显示id 2、3和4的平均评级高于1.x。如果您首先对每个id的评级进行平均,则每个id的平均评级恰好等于其id。这些评级的平均值为2.5。这将表明只有id 3和4具有更高的平均值

SELECT id
,      rating
FROM   (
    SELECT x.id
    ,      AVERAGE(x.rating) AS rating
    FROM   ratings
    GROUP BY x.id
) avgRatings
WHERE  rating >= (SELECT AVERAGE(rating) FROM avgRatings)

如果您希望所选id的平均值大于其他id的平均值,则必须首先获取平均值的平均值,以便您比较每个单独平均值的平均值不会被一个id所扭曲,因为一个id的报告评级要多得多,而我们的报告评级要少得多

e、 g.-id:1得到1000分1,id:2得到1分2,id:3得到一分3,id:4得到1分4。在这种情况下,如果你只取所有评分的平均值,它略大于1(这将显示id 2、3和4的平均评级高于1.x。如果您首先对每个id的评级进行平均,则每个id的平均评级恰好等于其id。这些评级的平均值为2.5。这将表明只有id 3和4具有更高的平均值

SELECT id
,      rating
FROM   (
    SELECT x.id
    ,      AVERAGE(x.rating) AS rating
    FROM   ratings
    GROUP BY x.id
) avgRatings
WHERE  rating >= (SELECT AVERAGE(rating) FROM avgRatings)

如果您希望所选id的平均值大于其他id的平均值,则必须首先获取平均值的平均值,以便您比较每个单独平均值的平均值不会被一个id所扭曲,因为一个id的报告评级要多得多,而我们的报告评级要少得多

e、 g.-id:1得到1000分1,id:2得到1分2,id:3得到一分3,id:4得到1分4。在这种情况下,如果你只取所有评分的平均值,它略大于1(这将显示id 2、3和4的平均评级高于1.x。如果您首先对每个id的评级进行平均,则每个id的平均评级恰好等于其id。这些评级的平均值为2.5。这将表明只有id 3和4具有更高的平均值

SELECT id
,      rating
FROM   (
    SELECT x.id
    ,      AVERAGE(x.rating) AS rating
    FROM   ratings
    GROUP BY x.id
) avgRatings
WHERE  rating >= (SELECT AVERAGE(rating) FROM avgRatings)

你使用什么RDBMS?它支持公共表表达式吗?(最后一个问题提示如何解决)我使用MySQL Workbench你使用什么RDBMS?它支持公共表表达式吗?(最后一个问题提示如何解决)我使用MySQL Workbench你使用什么RDBMS?它支持公共表表达式吗?(最后一个问题提示如何解决)我正在使用MySQL Workbench您使用什么RDBMS?它支持公共表表达式吗?(最后一个问题提示如何解决)我正在使用MySQL Workbench对不起,我是SQL新手,你能向我解释最后一部分吗?谢谢!欢迎你,如果你想应用聚合列的一些条件,你必须使用
have
,有关更多信息,对不起,我是SQL新手,你能向我解释最后一部分吗?谢谢!如果你想应用aggr的一些条件,欢迎你egated列您必须使用
have
,有关更多信息,对不起,我是SQL新手,您能向我解释最后一部分吗?谢谢!欢迎您,如果您想应用聚合列的一些条件,您必须使用
have
,有关更多信息,对不起,我是SQL新手,您能向我解释最后一部分吗?谢谢!欢迎您,如果要应用聚合列的某些条件,必须使用
having
,以了解更多信息