我正在使用MySQL,目前正试图了解一段代码的工作方式。这与Hackerrank SQL question titled "Challenges"有关。问题陈述如下
Julia要求她的学生提出一些编码挑战。写一个 查询以打印hacker_id,名称和挑战总数 由每个学生创建。将结果按总数排序 降序挑战。如果有多个学生创建了 相同数量的挑战,然后按hacker_id对结果进行排序。如果更多 比一个学生创造相同数量的挑战和数量 小于创建的最大挑战数,然后排除 结果中的那些学生。
我找到了一个有效的MySQL解决方案courtesy of this page,该解决方案使用以下代码:
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;
截至目前,我了解问题陈述,直到“ ”。如果有多个学生提出了相同数量的挑战,而该数量少于创建的最大挑战数量,则将这些学生排除在结果 。”我根本不知道如何构造查询来解决该语句。
在上面提供的代码中,我了解到本节之前所做的一切
cnt NOT IN (SELECT COUNT(c2.challenge_id) FROM Challenges AS c2 GROUP BY c2.hacker_id HAVING c2.hacker_id <> c.hacker_id)
任何人都可以帮助我了解这一行的内容以及其背后的逻辑吗?具体来说,我不知道c2.hacker_id <> c.hacker_id应该做什么。我猜想整行会选择不是同一个人的特定hacker_id完成的Challenge_id的数量,但是我不知道如何解决该查询。
答案 0 :(得分:1)
解析函数非常有用可以帮助您解决此类问题,因此,我将提供使用MySQL 8+的解决方案,该解决方案将逐步成为您的问题的读者所使用的数据库。 (而且HackerRank有时也会使用MySQL 8 +)。
WITH cte AS (
SELECT
c.hacker_id,
h.name,
COUNT(c.challenge_id) AS cnt,
ROW_NUMBER() OVER (ORDER BY COUNT(c.challenge_id) DESC) rn,
MIN(c.hacker_id) OVER (PARTITION BY COUNT(c.challenge_id)) hacker_id_min,
MAX(c.hacker_id) OVER (PARTITION BY COUNT(c.challenge_id)) hacker_id_max
FROM Hackers AS h
INNER JOIN Challenges AS c
ON h.hacker_id = c.hacker_id
GROUP BY
c.hacker_id,
h.name
)
SELECT
hacker_id,
name,
cnt
FROM cte
WHERE
rn = 1 OR hacker_id_min = hacker_id_max
ORDER BY
cnt DESC,
c.hacker_id;
此答案通过计算行号来回答,行号按计数降序排列。它还为挑战计数的每个分区计算最小hacker_id
和最大import win32com.client
outlook = win32com.client.Dispatch("Outlook.Application")./
GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items
message = messages.GetLast()
body_content = message.body
print body_content
值。如果记录属于最高计数,则将保留这些记录,而与第一名无关。如果给定的计数仅与单个用户相关联,则记录也会保留。
答案 1 :(得分:1)
假设您没有此子句时,会从查询中获得黑客ID和子计数的列表:
hacker, counter
1, 10
2, 9
3, 9
两个和三个不应该在那儿,因为它们在数量上是并列的,因此我们可以将其实现为排除任何计数为9的人
考虑到从概念上讲,数据库将对结果中的每一行运行查询:在处理黑客2行时,查询会获取ID为2的某人的质询计数列表。这意味着在考虑黑客2时,dB将返回以下计数列表:
10, --it comes from hacker 1
9 --it comes from hacker 3
然后数据库转到“我正在处理数量为9的黑客2。如果黑客2的count(9)不在以下值列表中,则结果中只能包括黑客2:10、9。 ,其中9属于禁止使用的值。我将从结果中排除黑客2
为黑客3重复,这次来自黑客2的计数为9,因此3也被排除了