一个简单sql,记住高级的,可惜忘记了初级的

本文介绍了一种使用SQL查询来找出每个部门中薪资排名前三的员工的方法。提供了两种解决方案:一种是通过子查询的方式进行基本处理;另一种是利用窗口函数简化查询过程。这两种方法各有优势,适合不同的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求是找出每个部门薪水最高的三个职员。

dep 部门
emp 人员
sal 薪水

基本处理方式

with tmp_t0 as (
  select '开发部' as dep,'张一' as emp, 1000::int8 as sal union all
  select '开发部' as dep,'张二' as emp, 2000::int8 as sal union all
  select '开发部' as dep,'张三' as emp, 3000::int8 as sal union all
  select '开发部' as dep,'张四' as emp, 4000::int8 as sal union all
  select '测试部' as dep,'李一' as emp, 2000::int8 as sal union all
  select '测试部' as dep,'李二' as emp, 8000::int8 as sal union all
  select '测试部' as dep,'李三' as emp, 4000::int8 as sal union all
  select '运维部' as dep,'王一' as emp, 500::int8 as sal 
)
select t0.dep,
       t0.emp,
       t0.sal
  from tmp_t0 t0
 where 1=1
   and ( select count(1)
           from tmp_t0 t1
          where 1=1
            and t0.dep=t1.dep
            and t1.sal >= t0.sal
        ) <=3
 order by t0.dep,
          t0.sal desc

分析函数处理

with tmp_t0 as (
  select '开发部' as dep,'张一' as emp, 1000::int8 as sal union all
  select '开发部' as dep,'张二' as emp, 2000::int8 as sal union all
  select '开发部' as dep,'张三' as emp, 3000::int8 as sal union all
  select '开发部' as dep,'张四' as emp, 4000::int8 as sal union all
  select '测试部' as dep,'李一' as emp, 2000::int8 as sal union all
  select '测试部' as dep,'李二' as emp, 8000::int8 as sal union all
  select '测试部' as dep,'李三' as emp, 4000::int8 as sal union all
  select '运维部' as dep,'王一' as emp, 500::int8 as sal 
)
select t00.dep,
       t00.emp,
       t00.sal
from (
    select t0.dep,
           t0.emp,
           t0.sal,
           rank() over (partition by t0.dep order by t0.sal desc) as rk
      from tmp_t0 t0
     where 1=1
     ) t00
where 1=1
  and t00.rk <=3
 order by t00.dep,

第一个基本处理方式居然没有想到,一看到需求就想到用分析函数。
懂得高级的,也不能忘记初级的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

数据库人生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值