oracle row_number()
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle row_number()相关的知识,希望对你有一定的参考价值。
要求查询每个用户对应的最大样品信息,忽然想到ms sql提供过 row_number() over(partition by 列 order by 列 desc),那么oracle可能也存在,
我的表结构如下:
create table NEOGOODSRULE
(
ID NUMBER(22) not null,
PERSONALID NVARCHAR2(50),
CT_SMP_TYPE NVARCHAR2(100)
)
tablespace VGSM
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
数据如下:
insert into neogoodsrule (ID, PERSONALID, CT_SMP_TYPE)
values (2270, ‘JYZ‘, ‘原料‘);
insert into neogoodsrule (ID, PERSONALID, CT_SMP_TYPE)
values (2271, ‘JYZ‘, ‘辅料‘);
insert into neogoodsrule (ID, PERSONALID, CT_SMP_TYPE)
values (2359, ‘SYSTEM‘, ‘包材(内)‘);
insert into neogoodsrule (ID, PERSONALID, CT_SMP_TYPE)
values (2360, ‘SYSTEM‘, ‘包材(外)‘);
insert into neogoodsrule (ID, PERSONALID, CT_SMP_TYPE)
values (2361, ‘SYSTEM‘, ‘原料‘);
insert into neogoodsrule (ID, PERSONALID, CT_SMP_TYPE)
values (2362, ‘SYSTEM‘, ‘成品‘);
insert into neogoodsrule (ID, PERSONALID, CT_SMP_TYPE)
values (2363, ‘SYSTEM‘, ‘稳定性(加速)‘);
insert into neogoodsrule (ID, PERSONALID, CT_SMP_TYPE)
values (2364, ‘SYSTEM‘, ‘稳定性(长期)‘);
insert into neogoodsrule (ID, PERSONALID, CT_SMP_TYPE)
values (2365, ‘SYSTEM‘, ‘辅料‘);
insert into neogoodsrule (ID, PERSONALID, CT_SMP_TYPE)
values (2354, ‘LY‘, ‘成品‘);
insert into neogoodsrule (ID, PERSONALID, CT_SMP_TYPE)
values (2355, ‘LY‘, ‘原料‘);
ROW_NUMBER()语法如下:
1、row_number() over(order by column asc)先对列column按照升序,再为每条记录返回一个序列号:
select personalid,row_number() over(order by personalid asc) rn from neogoodsrule
2、row_number() over(partition by column1 order by column2 asc) 先按照column1分组,再对分组后的数据进行以column2升序排列
select personalid,ct_smp_type,row_number() over(partition by personalid order by ct_smp_type asc) rn from neogoodsrule
由此,开始所提的需求sql代码如下
select * from (select personalid,ct_smp_type,row_number() over(partition by personalid order by ct_smp_type asc) rn from neogoodsrule )
where rn=1
使用row_number()分页函数取代group by。例如:语句1:
select col1,col2 from t where col1 in (select col1 from t group by col1 having count(*) <=2 ) order
by order col2;
语句1可以用下面的语句取代:
语句2:
select col1,col2 from (select *,row_number() over(partition by col1 order by col2) as p_group from
t) where p_group<=2 ;
ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2)
表示根据COL1分组,在分组内部根据 COL2排序。而这个值就表示每组内部排序后的顺序编号(组内连续的唯一的
)。
----------------------------------------------------------------------------------
得到结果:
A B C SUM(C)OVER(PARTITIONBYA)
-- -- ------- ------------------------
h b 3 3
m a 2 4
m a 2 4
n a 3 6
n b 2 6
n b 1 6
x b 3 9
x b 2 9
x b 4 9
如果用sum,group by 则只能得到
A SUM(C)
-- ----------------------
h 3
m 4
n 6
x 9
无法得到B列值
RANK() OVER (PARTITION BY COL1 ORDER BY COL2)
类似,不过RANK 排序的时候跟派名次一样,可以并列2个第一名之后 是第3名。
dense_rank() OVER (PARTITION BY COL1 ORDER BY COL2)
类似。是连续排序,有两个第二名时仍然跟着第三名。
dept sal emp row_number rank dense_rank
---- ------- ----- ---------- ----- ----------
10 5000.00 7839 1 1 1
10 2450.00 7782 2 2 2
10 1300.00 7934 3 3 3
20 3000.00 7788 1 1 1
20 3000.00 7902 2 1 1
20 2975.00 7566 3 3 2
20 1100.00 7876 4 4 3
20 800.00 7369 5 5 4
30 2850.00 7698 1 1 1
30 1600.00 7499 2 2 2
在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果
以上是关于oracle row_number()的主要内容,如果未能解决你的问题,请参考以下文章