Leetcode_569_员工薪水中位数_SQL

这篇博客探讨了一种使用SQL查询计算公司内部各个部门员工薪资中位数的方法。通过窗口函数row_number()和count(),结合条件筛选,可以有效地找出每个部门薪资的中位数,无论是单值还是范围。这种方法对于理解和处理大数据集中的统计问题非常有用。
with t as (
    select id, company, salary, row_number() over(partition by company order by salary) as 'rk', count(id) over(partition by company) as 'cnt'
    from Employee
)

select id, company, salary
from t
where rk >= cnt / 2 and rk <= cnt / 2 + 1

不算难吧,如果用函数的话,很有意思的事,中位数这个问题通过cnt和rank的大小来决定是一个还是两个,这个点想到了应该没什么难度

SQLLeetCode 上非常常见的题型,涵盖了从基础查询到复杂联表、子查询、窗口函数等各类问题。以下是一些典型的 SQL 题目及其解决方案示例。 --- ### 1068. 产品销售分析 I 该问题要求统计每个销售人员(`seller_id`)的总销售额,并按任意顺序返回结果。 ```sql SELECT seller_id, SUM(price) AS total_sales FROM Sales GROUP BY seller_id; ``` 此查询通过 `GROUP BY` 对每个销售人员进行分组,并使用 `SUM()` 函数计算其总销售额 [^1]。 --- ### 1069. 产品销售分析 II 在此基础上,进一步要求确保每位销售人员的销售记录是唯一的,可以通过如下方式实现: ```sql SELECT seller_id, COUNT(DISTINCT product_id) AS num_unique_products FROM Sales GROUP BY seller_id; ``` 该查询统计了每位销售人员销售的不同产品数量,以验证数据完整性 [^1]。 --- ### 619. 只出现一次的最大数字 该问题要求找出只出现一次的数字中的最大值。可以使用子查询和 `COUNT()` 来实现: ```sql SELECT MAX(num) AS num FROM ( SELECT num FROM MyNumbers GROUP BY num HAVING COUNT(num) = 1 ) AS unique_numbers; ``` 该查询首先筛选出所有只出现一次的数字,然后从中选择最大值 [^3]。 --- ### 176. 第二高的薪水 查找第二高的薪水是一个经典问题,通常使用子查询与比较操作实现: ```sql SELECT MAX(Salary) AS SecondHighestSalary FROM Employee WHERE Salary < (SELECT MAX(Salary) FROM Employee); ``` 该查询首先找出最高薪水,然后在外部查询中查找比它小的所有值中的最大值,即为第二高 [^3]。 --- ### 1549. 只出现一次的最大数字(变体) 在某些情况下,可能需要处理重复项并找出唯一值的最大值,可以使用 `GROUP BY` 和 `HAVING` 子句: ```sql SELECT MAX(id) AS max_single_id FROM ( SELECT id FROM numbers GROUP BY id HAVING COUNT(id) = 1 ) AS single_ids; ``` 这种结构常用于查找唯一出现的数值的最大值 [^1]。 --- ### 1412. 查找成绩中第 2 高分数的学生 这是一个进阶问题,要求找到第 2 高分数的学生信息,通常结合窗口函数: ```sql SELECT student_id, score FROM ( SELECT student_id, score, DENSE_RANK() OVER (ORDER BY score DESC) AS rk FROM Scores ) AS ranked_scores WHERE rk = 2; ``` 该查询使用 `DENSE_RANK()` 窗口函数对分数排序并分配排名,然后筛选出排名为 2 的学生 [^2]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值