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 .
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)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.