优化简单sql查询

m4pnthwp  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(341)

假设你有一个学生表和一个平均绩点。这个想法是返回的学生或学生与最高的平均绩点。如果只有一个学生,奖金是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)
vvppvyoh

vvppvyoh1#

我想你需要窗口功能:

select t.*,
       1000.0 / count(*) over ()
from t
where t.gpa = (select max(t2.gpa) from test t2);

带索引的 gpa ,这可能是最快的解决方案。

相关问题