【发布时间】:2019-07-18 08:04:36
【问题描述】:
我一直在研究一个 HackerRank SQL 问题,"Challenges"。
这就是问题所在:
Julia 要求她的学生创造一些编码挑战。编写查询以打印hacker_id、姓名和每个学生创建的挑战总数。按挑战总数降序排列您的结果。如果多个学生创建了相同数量的挑战,则按hacker_id 对结果进行排序。如果多个学生创建了相同数量的挑战,并且计数小于创建的最大挑战数量,则将这些学生排除在结果之外。
这个问题把我难住了,我正在网上搜索其他人是如何解决它的,这时我遇到了这个Github here,他提出了一个非常优雅的解决方案。
SELECT c.hacker_id,
h.name,
COUNT(c.challenge_id) AS cnt
FROM Hackers AS h
JOIN Challenges AS c ON h.hacker_id = c.hacker_id
GROUP BY c.hacker_id, h.name
HAVING cnt = (SELECT COUNT(c1.challenge_id)
FROM Challenges AS c1
GROUP BY c1.hacker_id
ORDER BY COUNT(*) DESC
LIMIT 1)
OR
cnt NOT IN (SELECT COUNT(c2.challenge_id)
FROM Challenges AS c2
GROUP BY c2.hacker_id
HAVING c2.hacker_id <> c.hacker_id)
ORDER BY cnt DESC, c.hacker_id;
我了解发帖者如何确保我们在 HAVING 的第一个条件下只能获得最大数量的挑战,但至于第二部分,我不太明白。我不确定为什么 HAVING 查询的第二个条件有效: HAVING c2.hacker_id c.hacker_id
不会总是 c2.hacker_id = c.hacker_id 吗?
【问题讨论】: