SQL进阶——GROUP BY 和 PARTITION BY

运行环境 win10 / oracle(DB11g)

一、rank()dense_rank()row_number()

-- 创表
create table teams_5
(
    member varchar(6),
    team   varchar(4),
    age   SMALLINT
)
;

insert into teams_5 values ('大木', 'A', 28);
insert into teams_5 values ('一件', 'A', 19);
insert into teams_5 values ('新特', 'A', 23);
insert into teams_5 values ('山田', 'B', 40);
insert into teams_5 values ('九本', 'C', 30);
insert into teams_5 values ('乔天', 'D', 28);
insert into teams_5 values ('野野宫', 'D', 28);
insert into teams_5 values ('加藤', 'D', 24);
insert into teams_5 values ('新城', 'D', 22);

-- 排序
select member, team, age,
       rank() over(partition by team order by age desc) rn,
       dense_rank() over(partition by team order by age desc) dense_rn,
       row_number() over(partition by team order by age desc) row_num 
  from teams_5
 order by team, rn
;

结果:

MEMBER TEAM        AGE         RN   DENSE_RN    ROW_NUM
------ ---- ---------- ---------- ---------- ----------
大木   A            28          1          1          1
新特   A            23          2          2          2
一件   A            19          3          3          3
山田   B            40          1          1          1
九本   C            30          1          1          1
乔天   D            28          1          1          1
野野宫 D            28          1          1          2
加藤   D            24          3          2          3
新城   D            22          4          3          4

rn 位次有跳动,row_num连续

二、用求余数分组 (抽样)

-- 从原来的表中抽出(大约)五分之一的数据
select *
  from sometbl
 where mod(seq, 5) = 0
;

--如果没有连续编号,用row_number()函数生成
select * 
  fromselect col,
                row_number() over(order by col) as seq
          from somtbl)
 where mod(seq, 5) = 0
 ;

内容多来自 《SQL进阶教材》,仅做笔记。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Scc_hy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值