oracle的ROW_NUMBER() OVER函数的基本用法

 转自:http://www.cnblogs.com/icebutterfly/archive/2009/08/05/1539657.html

 语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)

 

row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

 

例子1:row_number中有1,2,3等数字

SElECT row_number() over(partition by b.agency_item_id, c.processinst_id order by c.createdate desc) row_num,
                    b.agency_item_id,
                    b.agency_id,
                    d.*
               FROM tb_bgt_dept_status b
               join tb_bgt_ref_dept_wf c
                 on b.id = c.bgt_wf_id
               join v_wf_working d
                 on c.processinst_id = d.PROCINSTID
              where b.annual = 2016

注意:例1的图见下面

 

 

 

例子2:都是数字1

SElECT row_number() over(partition by b.agency_item_id, c.processinst_id order by c.createdate desc) row_num,
                    b.agency_item_id,
                    b.agency_id,
                    d.*
               FROM tb_bgt_dept_status b
               join tb_bgt_ref_dept_wf c
                 on b.id = c.bgt_wf_id
               join v_wf_working d
                 on c.processinst_id = d.PROCINSTID
              where b.annual = 2016

)where row_num=1

注意:例子2见图2

 

 

第二:查询是否出现一次,查询出现几次

    select count(agency_id) ,t.agency_id  from tb_plan_info t group by t.agency_id

 

 

---------------------------------------------------------------------------------------以下是两个sql对比,效果是一样的。

流程中找到当前实例的当前最大环节的两种做法(查看流程图)

sql1:如下:按照流程实例和操作流程用户进行分组。找到该流程实例中现在操作的最后一个流程

  SELECT VW.*
 FROM V_WF_WORKDONE VW,
 (SELECT PROCINSTID, USERID, MAX(TASK_END_TIME) MAXENDDATE
  FROM V_WF_WORKDONE
  GROUP BY PROCINSTID, USERID) VT
  WHERE VW.TASK_END_TIME = VT.MAXENDDATE
  AND VW.PROCINSTID = VT.PROCINSTID
  AND VW.USERID = VT.USERID

 

 

sql2:如下:先按照流程实例和用户进行分组,然后在按照时间排序,最后取第一条数据

SELECT row_number() over(partition by v.PROCINSTID, v.USERID order by v.TASK_END_TIME desc) row_num,
       v.TASKINSTID,
       v.USERID,
       v.PROCINSTID,
       v.taskdef,
       v.TASK_END_TIME
  FROM v_wf_workdone v where row_num=1

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值