SQL Server:至少提交一份完整评分的***竞争对手
Posted
技术标签:
【中文标题】SQL Server:至少提交一份完整评分的***竞争对手【英文标题】:SQL Server: Top competitor with at least one full scoring submission 【发布时间】:2021-03-10 15:15:59 【问题描述】:这里是问题的上下文
朱莉娅刚刚完成了一场编码比赛,她需要你的 帮助组装排行榜!编写查询以打印相应的 hacker_id 和获得满分超过的黑客的名字 一项挑战。按总数降序排列您的输出 黑客获得满分的挑战次数。如果更多 比一位黑客在相同数量的挑战中获得满分, 然后按hacker_id升序对它们进行排序。
我的策略是将所有表连接成一个大表,并按数据分组以满足要求。
但是我从我的代码中得到了这个错误:
选择列表中的“Hackers.name”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中
SELECT H.hacker_id, H.name
FROM Hackers H
INNER JOIN CHALLENGES C ON H.hacker_id = C.hacker_id
INNER JOIN Submissions S ON S.Challenge_id = C.Challenge_id
INNER JOIN Difficulty D ON D.difficulty_level = C.difficulty_level
WHERE S.score = D.score
AND C.difficulty_level = D.difficulty_level
-- Query can work before this line.
GROUP BY H.hacker_id
HAVING COUNT(S.submission_id) > 1
ORDER BY COUNT(S.submission_id) DESC, H.hacker_id ASC
【问题讨论】:
mysql 或 (ms)sql-server? 如消息所述,您需要在 GROUP BY 子句中包含H.name
。不属于聚合函数(SUM、MIN、MAX、AVG)的所有列都必须在 GROUP BY 中。这在任何体面的 SQL 教程或书籍中都有介绍。另外,请在发布问题之前搜索错误消息,因为以前在这里被问过的可能性很大。在用户在这里提出问题之前,我们期望用户进行彻底的搜索。
这能回答你的问题吗? Column "invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause"
谢谢,这正是我需要的
【参考方案1】:
同时按黑客 ID 和名称分组
我用另一条连接路进行了这个查询并且工作正常
SELECT h.hacker_id , h.name
FROM submissions s
INNER JOIN hackers h on h.hacker_id = s.hacker_id
INNER JOIN challenges c on c.challenge_id = s.challenge_id
INNER JOIN difficulty d on d.difficulty_level = c.difficulty_level
WHERE s.score = d.score
AND c.difficulty_level = d.difficulty_level
GROUP BY h.hacker_id ,h.name
HAVING COUNT(s.submission_id) > 1
ORDER BY COUNT(s.submission_id) DESC, h.hacker_id ASC
【讨论】:
【参考方案2】:第一次在堆栈上回答问题,但这就是我所做的
SELECT T.hacker_id, T.name FROM
(SELECT h.hacker_id,h.name, CASE
WHEN d.score = s.score then 1
ELSE 0 END AS perfect_score
FROM hackers h join submissions s on h.hacker_id = s.hacker_id
join challenges c on s.challenge_id = c.challenge_id
join difficulty d on c.difficulty_level = d.difficulty_level
WHERE
CASE WHEN d.score = s.score then 1 ELSE 0 END = 1) AS T
GROUP BY T.name, T.hacker_id
Having COUNT(*)>1
ORDER BY COUNT(*) DESC, hacker_id ASC;
【讨论】:
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案3】:SELECT h.hacker_id, h.name FROM Submissions AS s JOIN Hackers AS h ON s.hacker_id = h.hacker_id JOIN Challenges AS c ON s.challenge_id = c.challenge_id JOIN Difficulty AS d ON c.difficulty_level = d.难度等级 WHERE s.score = d.score GROUP BY h.hacker_id, h.name HAVING COUNT()>1 ORDER BY COUNT() DESC, h.hacker_id;
【讨论】:
以上是关于SQL Server:至少提交一份完整评分的***竞争对手的主要内容,如果未能解决你的问题,请参考以下文章