【发布时间】:2020-11-06 05:14:52
【问题描述】:
我刚从面试回家,他们让我参加编程测试。真正困扰我的问题之一如下:
您是一所高中的老师,负责为即将举行的全国辩论锦标赛挑选最好的辩论队。给定以下表结构:
CREATE TABLE CompetitionResults ( StudentName NVARCHAR(255) NOT NULL, -- The student's name SchoolYear INT NOT NULL, -- The school year of the student at the time they entered the competition CompetitionDate DATE NOT NULL, -- The date of the competition CompetitionResult INT NOT NULL -- The student's final score in the competition (0 - 100) )编写一个查询,根据他们之前的比赛结果返回即将举行的比赛的最佳候选人的姓名。
约束:
- 返回单列,
StudentName。- 每个学年 (7 - 12 岁) 只能选择一名学生。
- 每位返校学生今年必须参加过 3 次其他比赛。
这是我遇到最多问题的最后一个约束。这是我在时间用完后最终提交的内容:
SELECT
StudentName AS sn,
(SELECT COUNT(*) AS NumComps, CompetitionDate FROM CompetitionResults
WHERE YEAR(CompetitionDate) = 2020 AND NumComps = 3),
SchoolYear,
CompetitionDate,
CompetitionResult
FROM CompetitionResults
WHERE CompetitionDate IN (SELECT MIN(CompetitionDate)
FROM CompetitionResults GROUP BY CompetitionDate) AND
CompetitionResult IN (SELECT MAX(CompetitionResult) FROM
CompetitionResults WHERE StudentName = sn);
为了职业发展,我希望能够在尽可能少的帮助下解决这个问题,但正如您可能知道的那样,我在这里真的很挣扎。这段代码甚至无法编译,更不用说所有子查询的性能影响了!但是,我发现它们比连接更容易编码,因此我在这里使用它们。
非常感谢任何指导/提示。 MTIA :-)
【问题讨论】:
-
Count()和HAVING有什么问题?GROUP BY也会有所帮助。当您的SELECT语句包含 5 列时,您也不可能返回单列。 -
"当您的 SELECT 语句包含 5 列时,您也不可能返回单列"。我很清楚这一点,但我认为这是挑战的一部分。我想需要某种连接或某些东西来删除额外的列......或者我应该制作一个包含所有信息的临时表,并从中选择。我真的不确定:-/
-
@KenWhite,不仅非常有可能,而且非常简单:嵌套选择外部返回您感兴趣的唯一列的位置,对吧?
-
@FDavidov:我指的是 OP 在问题中提供的 SELECT。我没有说其他方式是不可能的。
-
@KenWhite,感谢您的澄清。不过,您不妨考虑改写您的评论。干杯。
标签: sql sql-server distinct