【SQL每日一练】HackerRan-Basic Join-Challenges练习


题目

编写一个查询来打印 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
    
  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十一*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值