我试图找出平均得分为80或更高的用户数量。我在查询中使用Having
但它没有返回行数。
Schema看起来像:
user
test_no
question_no
score
我的查询:
SELECT "user" FROM results WHERE (score >0) GROUP BY "user"
HAVING (sum(score) / count(distinct(test_no))) >= 80;
我明白了:
user
2
4
8
(3 rows)
相反,我想将3
(行数)作为输出。如果我count("user")
,我会得到每个用户的测试次数。
我理解这与使用Group By有关,但是我需要它用于我的Having子句。任何建议我如何能做到这一点表示赞赏。
更新:以下是一些示例数据:http://pastebin.com/k1nH5Wzh(-1表示无人接听)
谢谢!
答案 0 :(得分:1)
我不确定这是否是一种有效的方法,但这似乎有效。
SELECT COUNT(*) FROM
(SELECT "user" FROM results WHERE (score >0) GROUP BY "user"
HAVING (sum(score) / count(distinct(test_no))) >= 80)) q1;
答案 1 :(得分:1)
您找到的查询很好。一些小的简化:
SELECT count(*) AS ct
FROM (
SELECT 1
FROM result
WHERE score > 0
GROUP BY user_id
HAVING (sum(score) / count(DISTINCT test_no)) >= 80
) sub
DISTINCT
不需要括号。
您可以在子查询中SELECT
一个常量值。该值无关紧要,因为您只计算行数。稍短且便宜。
请勿使用保留字user
作为列名。那是在惹麻烦。我正在使用user_id
。