How do I get 2 of the distinct records (including the records with same scores) above the average? Not including the top among rest.
Here's my sample table
| id | scores |
|---|---|
| 111 | 8.50 |
| 120 | 7.45 |
| 123 | 9.13 |
| 127 | 7.70 |
| 222 | 6.00 |
| 232 | 7.77 |
| 321 | 6.80 |
| 342 | 6.90 |
| 453 | 6.66 |
| 564 | 9.05 |
| 666 | 8.50 |
| 876 | 8.90 |
First, I need to figure out how to get the average.
avg(scores) = 7.78
My expected result is:
| id | scores |
|---|---|
| 876 | 8.90 |
| 111 | 8.50 |
| 666 | 8.50 |
What I have tried so far:
select Examinee_number, score
from examinees
where score >
(select avg(score)
from examinees
order by score
limit 2);
select Examinee_number, score
from examinees
where score >
(select avg(score)
from examinees)
order by score desc
limit 2;
The average should be a reference for scores, in case I only need to get the the scores above the average (score = 8.50) or below the average (score = 7.77).
CodePudding user response:
On MySQL 8 , we can use the RANK() analytic function here. For finding the average score excluding the two top highest, we can try:
WITH cte AS (
SELECT score, RANK() OVER (ORDER BY score DESC) rnk
FROM examinees
)
SELECT AVG(score)
FROM cte
WHERE rnk > 2;
CodePudding user response:
select * from `score` where score > (WITH new AS (select * from `score` where score > (SELECT ROUND(AVG(score), 2) FROM `score`) ORDER BY score limit 2) select AVG(score) from new);
select * from score where score < (SELECT AVG(score) FROM `score`) ORDER BY score;
