优化简单SQL查询

优化简单SQL查询,sql,Sql,假设你有一个学生表和一个gpa。这个想法是让GPA最高的学生返回。如果只有一名学生,奖金是1000美元。否则,该金额将在平均成绩最高的学生人数之间进行分配。下面的结果返回了我所期望的结果,3名学生和333名学生。我想知道这是编写查询的最佳方式还是最佳方式 CREATE TABLE Test ( PersonID int, Name varchar(255), GPA DECIMAL(3,2) ); INSERT INTO Test(personid, name, gpa

假设你有一个学生表和一个gpa。这个想法是让GPA最高的学生返回。如果只有一名学生,奖金是1000美元。否则,该金额将在平均成绩最高的学生人数之间进行分配。下面的结果返回了我所期望的结果,3名学生和333名学生。我想知道这是编写查询的最佳方式还是最佳方式

CREATE TABLE Test (
    PersonID int,
    Name varchar(255),
    GPA DECIMAL(3,2)
);

INSERT INTO Test(personid, name, gpa) VALUES(1, 'Frank', 2.7)
INSERT INTO Test(personid, name, gpa) VALUES(2, 'Barb', 3.7)
INSERT INTO Test(personid, name, gpa) VALUES(3, 'Tammy', 3.7)
INSERT INTO Test(personid, name, gpa) VALUES(4, 'Edward', 3.7)

Select name, gpa,
(Select Case When Count(*) = 1 Then '1000'
 Else 1000/COUNT(*)
 End
 FROM Test
 WHERE gpa = (SELECT MAX(gpa) FROM test)
) As 'Prize Amount'
FROM Test
Where gpa = (SELECT MAX(gpa) FROM test)

我觉得它效率不高,因为必须查询两次。我只想除以行数。下面类似的内容不起作用(groupby问题),在gpa上添加groupby,name将始终显示1000,因为每组name/gpa都有一条记录

Select name, gpa,
Case When Count(*) = 1 Then '1000'
Else 1000/COUNT(*)
End As 'Prize Amount'
FROM Test
Where gpa = (SELECT MAX(gpa) FROM test)

我认为您需要窗口功能:

select t.*,
       1000.0 / count(*) over ()
from t
where t.gpa = (select max(t2.gpa) from test t2);
索引位于gpa上,这可能是最快的解决方案