首页 > 解决方案 > 优化简单 SQL 查询

问题描述

假设你有一张学生表和一个 gpa。这个想法是返回 GPA 最高的学生或学生。如果只有一名学生,奖金为 1000 美元。否则,金额将分配给共享最高 gpa 的学生人数。下面的结果返回我所期望的,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,名称将始终显示 1000,因为每组名称/gpa 有 1 条记录。

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)

标签: sql

解决方案


我想你想要窗口功能:

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

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


推荐阅读