【问题标题】:SQL: CASE WHEN having AVG() as condition not giving right outputSQL:CASE WHEN 以 AVG() 作为条件时没有给出正确的输出
【发布时间】:2020-12-12 03:26:06
【问题描述】:

我有一个唯一用户表,每个用户都有一个“评分”列(这是他们在不同评论表中给出的所有评分中给出的平均评分)。我想在我的表中添加另一列,指定他们给出的评分高于所有用户的所有评分的平均值(因此我使用 AVG() 函数)、低于或平均值(我称之为“偏差” )。换句话说,我想看看每个用户的平均评分是否高于或低于总平均评分。我了解此查询的局限性,理想情况下我会包含一个区间(即低于或高于平均值 0.5 点仍算作平均值),但我似乎无法使最简单的查询工作。

我一直在使用 Coursera 课程中的 Yelp 数据集,但我尝试创建一个样本,该样本产生了我不想要的相同结果 - 仅一行。我想对每一行进行这种分类,因此在这个例子中它应该返回 3 行,前两行“低于平均水平”,第三行“高于平均水平”。但是,下面的代码只产生一行。我一直在使用 R,这似乎我使用了不正确的语法,但是在网上搜索了 30 分钟后,我找不到解决方案。

我正在工作并希望在 Coursera 的课程中​​使用 SQLite 语法

CREATE TABLE test 
    (
     id integer primary key, 
     rating integer
    );

INSERT INTO test
(id, rating)
VALUES
(1, 1);

INSERT INTO test
(id, rating)
VALUES
(2, 3);

INSERT INTO test
(id, rating)
VALUES
(3, 8);

SELECT id,
rating,
  CASE
    WHEN rating > AVG(rating) THEN "above average"
    WHEN rating < AVG(rating) THEN "below average"
    ELSE "no bias"
   END AS "bias"
FROM test

【问题讨论】:

    标签: sql sqlite average


    【解决方案1】:
    SELECT id,
    rating,
      CASE
        WHEN rating > (select AVG(rating) from test) THEN "above average"
        WHEN rating < (select AVG(rating) from test) THEN "below average"
        ELSE "no bias"
       END AS "bias"
    FROM test
    

    AVG 是一个聚合函数,与GROUP BY 一起工作。 当您未在 GROUP BY 部分中指定任何内容时,它将聚合整个表格,从而将其减少到一行。

    通常您选择聚合列和非聚合列而不在GROUP BY 列表中指定非聚合列。我不是允许这种行为的 DBMS 的忠实粉丝(SQLLite 似乎是违规者)。

    我在上面的查询中所做的是,我使用子查询计算了整个表的平均值。然后将每一行与平均值进行比较。

    或者像其他人指定的那样,您可以使用 WINDOW 函数。您在窗口定义的数据的某些部分上应用函数的位置。它们看起来像常规聚合函数 conunterparts,但您会注意到 OVER 关键字指定它们应用于窗口。在 over 子句中,您可以对数据进行分区,也可以将其作为一个整体使用。例如,如果您有多个商店,并且每个商店每天的销售额,您可以按商店划分以计算每个商店的平均值。

    【讨论】:

      【解决方案2】:

      你不能像这样使用聚合函数AVG()
      但是你可以用AVG()窗口函数来做到这一点:

      SELECT id,
      rating,
        CASE
          WHEN rating > AVG(rating) OVER () THEN "above average"
          WHEN rating < AVG(rating) OVER () THEN "below average"
          ELSE "no bias"
         END AS "bias"
      FROM test
      

      请参阅demo
      结果:

      | id  | rating | bias          |
      | --- | ------ | ------------- |
      | 1   | 1      | below average |
      | 2   | 3      | below average |
      | 3   | 8      | above average |
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-22
        • 1970-01-01
        相关资源
        最近更新 更多