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()的更多相关文章
- oracle row_number() over(partition by .. order by ..)和rank() over(partition by .. order by ..) 和dense_rank() over(partition by .. order by ..)的相似点与区别
		新建一个测试表 create table dim_ia_test2(device_number varchar2(20),desc2 varchar2(20)) 插入数据后得到: 一.oracle r ... 
- oracle   ROW_NUMBER用法
		Oracle中row_number().rank().dense_rank() 的区别 row_number的用途非常广泛,排序最好用它,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复 使 ... 
- 问题:oracle ROW_NUMBER()over;结果: ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法
		ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法 ROW_NUMBER() OVER(partition by col1 order by col2) 表示根据col1分组, ... 
- oracle ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2)
		工作中遇到的一个问题,需要对某列进行分组排序,取其中排序的第一条数据项 用到了ROW_NUMBER() OVER(PARTITION BY COL1 ORDER BY COL2)来解决此问题. 实例准 ... 
- oracle row_number的使用
		create table studentInfo( id number(8) primary key, name varchar2(20) not null, ObjectName varcha ... 
- Oracle row_number() over() 分析函数--取出最新数据
		语法格式:row_number() over(partition by 分组列 order by 排序列 desc) 一个很简单的例子 1,先做好准备 create table test1( id v ... 
- oracle ROW_NUMBER() OVER(PARTITION BY '分组' ORDER BY '排序' DESC) 用法
		转载:https://blog.csdn.net/dbagaoshou/article/details/51330829 SELECT * FROM ( SELECT ROW_NUMBER() OVE ... 
- MySQL 实现 Oracle row_number over 数据排序功能
		一.方法一GROUP_CONCAT.SUBSTRING_INDEX 1.GROUP_CONCAT 2.SUBSTRING_INDEX 3.例子 首先我们可以首先根据job_id 排序然后根据start ... 
- 工作中 sql 整理(一)
		这篇文章记录关于SQL的内容,有些凌乱,是工作中点滴的积累,只能按照时间顺序,逐次记录. 一.update 关联更新 1.需求 Table A TableB A表中的主键和B表中的主键相关联,关联 ... 
随机推荐
- Objects and Data Structures
			Date Abstraction Hiding implementation is not just a matter of putting a layer of fucntions between ... 
- 使用RBL拦截垃圾邮件
			1. sbl-xbl.spamhaus.org 2 bl.spamcop.net 3 zen.spamhaus.org 
- PHP 调用oracle存储过程
			$orderdate = strtotime($this->input->get('orderdate')); $today = strtotime(date('Y-m-d',time() ... 
- Linux VPS下SSH常用命令
			目录操作:rm -rf mydir /*删除mydir目录,不需要确认,直接删除*/mkdir dirname /*创建名为dirname的目录*/cd mydir /*进入mydir目录*/cd - ... 
- eval函数的工作原理
			如果您想详细了解eval和JSON请参考以下链接: eval :https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Glob ... 
- 解决两台虚拟机互ping可通,但connect失败
			问题描述: 在UNP一书中实例中,采用两台不同的虚拟机.即一台虚拟机作为服务端,另外一台虚拟机作为客户端. 现象: 两台电脑各自互ping可通 客户端访问local可行 客户机访问服务端报错:No r ... 
- hadoop常用基础命令
			1.日志查询: 用户可使用以下命令在指定路径下查看历史日志汇总$ bin/hadoop job -history output-dir 这条命令会显示作业的细节信息,失败和终止的任务细节. 关于作业的 ... 
- 三分钟了解Activity工作流
			一. 什么是工作流 以请假为例,现在大多数公司的请假流程是这样的 员工打电话(或网聊)向上级提出请假申请——上级口头同意——上级将请假记录下来——月底将请假记录上交公司——公司将请假录入电脑 采用工作 ... 
- char类型与Unicode的编码
			Java的char型是非常独特的,占用两个字节,因为Java中char型采用了Unicode编码. 要理解这个问题,我们必须要理解什么是Unicode. 世界上存在着多种编码方式,同一个二进制数字可以 ... 
- java的加减乘除
			//编写一个程序,用户输入两个数,求出其加减乘除,并用消息框显示计算结果.//MengYao,2015,10,6 import javax.swing.JOptionPane;public class ... 
