文章目录
- 题目
- 题析
- 题解
- 1.sqlserver
题目
编写一个查询来打印 hacker _ id、 name 和每个学生创建的挑战的总数。按照挑战的总数按降序对结果进行排序。如果不止一个学生创建了相同数量的挑战,那么按 hacker _ id 对结果进行排序。如果不止一个学生创建了相同数量的挑战,且计数少于创建的最大数量的挑战,则将这些学生排除在结果之外。
输入格式:
下表包含挑战数据: Hackers: hacker _ id 是黑客的 id,name 是黑客的名称。
Challenges: Challenge _ id 是挑战的 id,hacker _ id 是创建挑战的学生的 id。
题析
据题已知:如果有多个学生的挑战数相同且挑战数不是最大值的话,就排除;则我们可以获取挑战数是最大值的数据或者挑战数计数是等于1的数据
题解
1.sqlserver
代码如下:
WITH H AS
(
SELECT
h.hacker_id, h.name,
COUNT(c.challenge_id) AS cnt
FROM
hackers AS h
INNER JOIN
Challenges AS c
ON
h.hacker_id = c.hacker_id
GROUP BY
h.hacker_id, h.name
), C AS
(
SELECT cnt, COUNT(*) AS cot, MAX(cnt) OVER() AS MCT
FROM H
GROUP BY cnt
)
SELECT
h.hacker_id,
h.name,
h.cnt
FROM
H
INNER JOIN
C
ON
H.cnt = C.cot AND
(C.cot = 1 OR C.cnt = MCT)
ORDER BY
h.cnt DESC,
h.hacker_id