Home > Enterprise >  Using AVG with HAVING
Using AVG with HAVING

Time:01-23

I looked at a similar question and read the documentation on the average function, but when I tried:

CREATE TABLE tab(
id      INT,
score   INT
);

INSERT INTO tab VALUES
(1, 22),
(2, 45),
(3, 82),
(4, 87);

SELECT score,AVG(score)
FROM tab 
GROUP BY score 
HAVING score>AVG(score)

which puts AVG after score, I get

There are no results to be displayed.

How can I get this to work?

Here's the fiddle.

CodePudding user response:

The problem here is that you're aggregating per "score". Doing such operation will bring you the average among one value for each record, hence being AVG(score) = score always.

You need to use the corresponding window function for that purpose (Demo):

WITH cte AS (
    SELECT score, AVG(score) OVER() AS average_score
    FROM tab 
)
SELECT * 
FROM cte
WHERE score > average_score

or if you don't mind not selecting the average in your final output (Demo):

SELECT score
FROM tab
WHERE score > (SELECT AVG(score) FROM tab)
  • Related