【问题标题】:SQL: Compare avg to overall avgSQL:将平均值与整体平均值进行比较
【发布时间】:2015-05-01 15:30:19
【问题描述】:

我有一张名为“评分”的表格

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 的平均评分,但是如何在不硬编码的情况下将其与总平均评分进行比较?

【问题讨论】:

  • 您使用什么 RDBMS?它是否支持公用表表达式? (最后一个问题提示如何解决)
  • 我正在使用 MySQL 工作台

标签: sql


【解决方案1】:

如果您希望所选 id 的平均值大于其他 id 的平均值,则必须先取平均值,这样您比较每个单独平均值的平均值就不会出现偏差通过一个 id 获得更多的报告评分,我们的报告评分会减少很多。

例如- id:1 获得 1000 个评分 1,id:2 获得 1 个评分 2,id:3 获得 1 个评分 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)

【讨论】:

    【解决方案2】:

    我会倾向于使用窗口函数:

    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
    

    【讨论】:

      【解决方案3】:

      使用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);
      

      【讨论】:

      • 对不起,我是 SQL 新手,你能解释一下最后一部分吗?谢谢!
      • 欢迎您,如果您想应用聚合列的某些条件,您必须使用having,了解更多信息see here
      猜你喜欢
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 1970-01-01
      • 2022-11-03
      相关资源
      最近更新 更多