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:至少提交一份完整评分的***竞争对手的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver数据库表数据误删除了 怎么恢复

SQL Server 报告服务查询

从 Excel 导入 SQL Server 2005 时出现截断错误

SQL server中事务的四个属性特征(ACID)

大数据Spark电影评分数据分析

SQL Server 中的常量函数(使用函数的慢视图)