基于聚合函数的结果

时间:2018-04-12 08:14:16

标签: sql postgresql case aggregate-functions

由于某些非常具体的情况,我发现自己必须编写这样的查询(示例简化):

SELECT username, avg(points) as average_points,
  CASE 
    WHEN average_points >= 100
      THEN TRUE
      ELSE FALSE
  END as is_winner
FROM user_points
GROUP BY username;

当然我不能这样做,因为average_points不是一列。有没有办法在单个查询中执行实际实现此操作的内容?

我考虑过使用子查询,但我必须分别计算每个用户的点数和布尔值。

3 个答案:

答案 0 :(得分:1)

重复一下这个表达方式。也不需要CASE

SELECT username, 
       avg(points) as average_points,
       avg(points) >= 100 as is_winner
FROM user_points
GROUP BY username;

如果您担心表现,avg(points)只会被评估一次。

另一种选择是将其放入派生表中:

SELECT username, 
       average_points,
       average_points >= 100 as is_winner
FROM (
   select username, avg(points) as average_points
   from user_points
   group by username
) pt;

答案 1 :(得分:0)

试试这个

SELECT username, avg(points) as average_points,
  CASE 
    WHEN avg(points) >= 100
      THEN TRUE
      ELSE FALSE
  END as is_winner
FROM user_points
GROUP BY username;

答案 2 :(得分:0)

您只需将代码更改为

SELECT
    username
    ,average_points
    ,CASE 
        WHEN average_points >= 100
          THEN TRUE
          ELSE FALSE
      END AS is_winner
FROM(
    SELECT 
        username
        , AVG(points) AS average_points
    FROM user_points
    GROUP BY username
);
相关问题