文章目录
- 题目
- 题析
- 题解
- 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
(SELECTh.hacker_id, h.name,COUNT(c.challenge_id) AS cntFROMhackers AS hINNER JOINChallenges AS cONh.hacker_id = c.hacker_idGROUP BYh.hacker_id, h.name
), C AS
(SELECT cnt, COUNT(*) AS cot, MAX(cnt) OVER() AS MCTFROM HGROUP BY cnt
)
SELECTh.hacker_id,h.name,h.cnt
FROMH
INNER JOINC
ONH.cnt = C.cot AND(C.cot = 1 OR C.cnt = MCT)
ORDER BYh.cnt DESC,h.hacker_id