精华内容
下载资源
问答
  • oracle如何实现分组排序和统计、聚集,如何分组求top N,什么是over分析函数,row_number(),rank(),dense_rank()区别又是什么, 如何找到一条记录的前后值,这份文档写得太好了。
  • oracle分组排序取前几

    2020-09-12 15:32:08
    项目需求:分组排序 1、要求取出按field1分组后,并在每组中按照field2排序; 2、根据要求取出1中已经分组排序好的前多少行的数据;  1.row_number() over() row_number()over(partition by col1 order by col2...
     项目需求:分组排序
    1、要求取出按field1分组后,并在每组中按照field2排序;
    2、根据要求取出1中已经分组排序好的前多少行的数据;

     1.row_number() over()

    row_number()over(partition by col1 order by col2)表示根据col1分组,再分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。 (1,2,3,4,5.....)

    2.rank() over()

    rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)(1,2,2,4,5...)

    3.dense_rank() over()

    dense_rank()也是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的。(1,2,2,3,4,5....)
    示例SQL代码:   
    CREATEDATE ACCNO MONEY
    2014/6/5 111 200 
    2014/6/4 111 600 
    2014/6/5 111 400 
    2014/6/6 111 300 
    2014/6/6 222 200 
    2014/6/5 222 800 
    2014/6/6 222 500 
    2014/6/7 222 100 
    2014/6/6 333 800 
    2014/6/7 333 500 
    2014/6/8 333 200 
    2014/6/9 333 0 

    1、select t.*,row_number() over(partition by accno order by createDate) row_number from Test t 

    查询结果如下: (即使某排序的字段的值相同,各组的row_number唯一)

    2、 select t.*,rank() over(partition by accno order by createDate) rank from Test t 

    查询结果 (根据 createDate排序,在1、2组中,日期都相同,因此row_number一致。接下来的是4)

    3、select t.*,dense_rank() over(partition by accno order by createDate) dense_rank from Test t 

    查询结果: (重复的row_number之后依然是row_number+1)
     
     
    第二个需求: 分组排序后分别取出各组内前多少的数据记录,如班级里有多个小组,求每组的前三名。
    select createDate,accno,money,row_number from (select t.*,row_number() over(partition by accno order by createDate) row_number from Test t) t1 where row_number<4
    查询结果如下:
     
     
    如果是按照多个字段分组,那么也是一样的。多条件分组,多条件排序。
    row_number()over(partition by a,b,c order by a,b,c)
     
    本文借鉴于:https://www.cnblogs.com/java-class/p/4726175.html
    展开全文
  • select * from ( select t., row_number() over (partition by user_sid order by sid desc) rn ,count() over (partition by user_sid) nums from sys_user_rel t where user_sid in (select sid from sys_user ...

    select * from (
    select t., row_number() over (partition by user_sid order by sid desc) rn ,count() over (partition by user_sid) nums from sys_user_rel t
    where user_sid in (select sid from sys_user where user_state = ‘LOCKED’) ) where rn=1

    展开全文
  • Oracle 分组排序函数

    千次阅读 2018-06-20 11:32:53
    2、亦或更加要求取出1中已经分组排序好的前多少行的数据这里通过一张表的示例和SQL语句阐述下oracle数据库中用于分组排序函数的用法。1.row_number() over()row_number()over(partition by col1 order by col2)表...

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况:

    1、要求取出按field1分组后,并在每组中按照field2排序;
    2、亦或更加要求取出1中已经分组排序好的前多少行的数据

    这里通过一张表的示例和SQL语句阐述下oracle数据库中用于分组排序函数的用法。
    1.row_number() over()
    row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。 
    与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪劣rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码。row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开始排序)。


    2.rank() over()
    rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)


    3.dense_rank() over()
    dense_rank()也是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的。

    示例:
    如有表Test,数据如下
    SQL代码:   
    CREATEDATE ACCNO MONEY 
    2014/6/5 111 200 
    2014/6/4 111 600 
    2014/6/5 111 400 
    2014/6/6 111 300 
    2014/6/6 222 200 
    2014/6/5 222 800 
    2014/6/6 222 500 
    2014/6/7 222 100 
    2014/6/6 333 800 
    2014/6/7 333 500 
    2014/6/8 333 200 
    2014/6/9 333 0 

    比如要根据ACCNO分组,并且每组按照CREATEDATE排序,是组内排序,并不是所有的数据统一排序,
    用下列语句实现:

    Sql代码 
    select t.*,row_number() over(partition by accno order by createDate) row_number from Test t 

    查询结果如下:


    大家可以注意到ACCNO为111的记录有两个相同的CREATEDATE,用row_number函数,他们的组内计数是连续唯一的,但是如果用rank或者dense_rank函数,效果就不一样,

    如下:
    rank的sql:
    select t.*,rank() over(partition by accno order by createDate) rank from Test t 

    查询结果:



    可以发现相同CREATEDATE的两条记录是两个第2时接下来就是第4.

    dense_rank的sql:
    Sql代码 
    select t.*,dense_rank() over(partition by accno order by createDate) dense_rank from Test t 

    查询结果:



    可以发现相同CREATEDATE的两个字段是两个第2时接下来就是第3.

    项目中特殊的业务需求可能会要求用以上三个不同的函数,具体情况具体对待。


    再比如有时会要求分组排序后分别取出各组内前多少的数据记录,sql如下:
    Sql代码 
    select createDate,accno,money,row_number from (select t.*,row_number() over(partition by accno order by createDate) row_number from Test t) t1 where row_number<4 


    查询结果如下:

     


    作者:Orson 
    出处:http://www.cnblogs.com/java-class/ 

    展开全文
  • 需求:先分组,再按时间排序,最后取分组第一条 利用oracle的开窗函数可以实现 以下是模板sql ,自行替换 select t.* from (select a.*, row_number() over(partition by 需要分组的字段 order by 更新时间 ...

    需求: 先分组,再按时间排序,最后取分组第一条数据

     

    利用oracle的开窗函数可以实现

    以下是模板sql ,自行替换

    select  t.*  
      from (select a.*, row_number() over(partition by 需要分组的字段 order by 更新时间 desc) rw  
               from 表 a) t  
      where t.rw = 1  

     

    展开全文
  • Oracle分组排序几种常见方式

    千次阅读 2019-01-21 09:46:00
    再比如有时会要求分组排序后分别取出各组内前多少的数据记录(需要用到子查询,先将数据进行分组排序,然后再分组排序后的数据中筛选符合条件的数据),sql如下: Sql代码  select createDate,accno,money,row_...
  • Oracle 分组排序问题

    2018-08-28 14:36:54
    问题描述 ...1、首先对a、b两个表进行分组排序,得到对应的rw 2、full join两张表,这个时候,就要用到rw,这样缺少的行就会为空,同时coalesce一下两张表,把不为空的数据填进去 3、取出需要的列
  • oracle分组排序

    千次阅读 2017-01-15 10:15:55
    oracle 分组排序: 这个麻烦: SELECT * FROM (  SELECT deptno, ename, sal, ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal DESC ) Top3 FROM emp ) WHERE Top3 开窗函数也ok:代码简单点:  where 1...
  • 要取出时间段中phonenumber的score最大并且examtime最小的记录,用max和min取的值都不是正确的记录值,用排序子查询的方法可以取到 select phonenumber,score,examtime,scoretime,createtime,rn from ( SELECT ...
  • Oracle 常用 group by 来进行分组查询,但这里使用row_number()over(partition by 字段1 order by 字段2 ),字段1表示根据此字段分组,字段2表示排序,此函数计算的值就表示每组内部排序后的顺序编号。 With t1 as...
  • 语法格式:row_number() over(partition by 分组列 order by 排序列 desc) SELECT * FROM ( SELECT ROW_NUMBER()OVER(PARTITION BY XMID ORDER BY ACTIVITYSTATUS)RN, PROJECT_NEW.* FROM PROJECT_NEW) T WHERE T....
  • oracle分组排序筛选

    2020-09-29 16:23:06
    oracle分组排序筛选 是不是遇到过这样的场景,我们要按某条件进行分组,分组后对每个组中再按一定条件排序,然后我们再选出每组符合条件的数据,比如我们有一张表,这张表里记录了全班所有人的所有学科的成绩,每条...
  • 排序的字段名 ) AS RN FROM 表名 ) WHERE RN 10 分组取数后按照特定条件行值转成列 通过group by 与MAX(CASE WHEN * THEN * end ) 实现 SELECT ooefl003 as 成本中心 , max ( case ...
  • oracle 分组排序

    2021-02-01 14:16:13
    oracle 分组排序
  • oracle 分组排序

    2014-03-25 15:27:30
    select a.inter_no,  row_number() over(partition by b.connid order by a.begin_time) rn  from CALL_CALOG_RECORD a, asr_pac_call_info b  where a.inter_no = b.session_id ...利用partition排序
  • 方法:row_number() over(partition by 分组条件列名 order by 排序条件列名) 别名 例子: 表名:tableTest 列: TASK_NO 合同号 START_TIME 启动时间 目的:查询某个合同下启动时间最新的那条数据 //通过...
  •     select empno, ename, deptno, sale ...https://community.oracle.com/thread/2539806?tstart=0 ,本人抛砖引玉,欢迎提出更好的方法,如有错误也请指出。谢谢 。     全文完 。  
  • ROW_NUMBER() OVER(partition by col1 order by col2) 表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内是连续且唯一的) SELECT PRORDER AS 计划月份, ROW_...
  • oracle分组排序: select * from ( select row_number() over(partition by ms.school_id order by ms.create_time desc) mm,ms.* from mark_switch ms ) t1 where t1.mm=1 mysql的分组排序
  • selectBOOKMARK_ID,SCANED_TIMEfrom(selectBOOKMARK_ID,SCANED_TIME,row_number()over(partitionbyBOOKMARK_TYPEorderbySCANED_TIMEasc)STfromSNSEC_BMARK_SCANED_BARCODEwhereBOO...
  • oracle分组排序几种情况总结

    千次阅读 2017-10-11 10:25:10
    分组排序:一组数据按col1分组,在每个组中再按col2排序。 相关函数: 1.row_number() over() row_number() over(partition by col1 order by col2)表示根据col1分组,在分组内根据col2排序,此函数的计算值是每...
  • 最近在工作中遇到进行分组排序的需求,然后进行了相关资料的查询,发现在Oracle中Partition By基本可以完美解决我的需求,现在总结分享一下. 准备建表数据: CREATE TABLE "TBL_STUDENNT_SCORE" ( "ID" NUMBER(16,0...
  • Oracle 分组排序取第一条

    千次阅读 2017-06-15 16:15:16
    Oracle 分组排序取第一条
  • oracle分组排序并取最大值

    千次阅读 2018-12-27 16:32:38
    最近工作中需要联合查询几个表中的数据,并且需要分组查询并取得每个组中的最大值,使用到了一个之前没有用过的oracle函数,分组排序函数。 分组排序函数可以满足以下需求: 1、要求取出按field1分组后,并在每组...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,998
精华内容 16,799
关键字:

oracle分组排序