Oracle排名功能问题

时间:2013-09-02 19:06:36

标签: sql oracle oracle11g oracle10g

我在oracle分析函数中遇到问题

我希望oracle中的排名顺序显示,但需要循环方式。但这个排名应该在一个组内发生。 说我有10组 在10组中,每组必须在9中排名。如果大于9,则等级值必须从1再次开始,然后结束,直到多少为止

emp id      date1               date 2                 Rank
123         13/6/2012           13/8/2021              1
123         14/2/2012           12/8/2014              2
                                                       . 
                                                       .
123         9/10/2013           12/12/2015             9
123         16/10/2013          15/10/2013             1
123         16/3/2014           15/9/2015              2

在上面的例子中,对于empid 123的行组,我已经以两个子组的方式拆分了等级。顺序从1到9是一个组,而对于其余的行,等级再次从1开始。如何在oracle排名函数中实现这一点。

1 个答案:

答案 0 :(得分:0)

根据以上Egor Skriptunoff的建议:

select
  empid, date1, date2
, row_number() over(order by date1, date2)             as "rank"
, mod(row_number() over(order by date1, date2)-1, 9)+1 as "cycle_9"
from yourtable

示例结果

| empid |                date1 |                date2 | rn | ranked |
|-------|----------------------|----------------------|----|--------|
| 72232 | 2016-10-26T00:00:00Z | 2017-03-07T00:00:00Z |  1 |      1 |
| 04365 | 2016-11-03T00:00:00Z | 2017-07-29T00:00:00Z |  2 |      2 |
| 79203 | 2016-12-15T00:00:00Z | 2017-05-16T00:00:00Z |  3 |      3 |
| 68638 | 2016-12-18T00:00:00Z | 2017-02-08T00:00:00Z |  4 |      4 |
| 75784 | 2016-12-24T00:00:00Z | 2017-11-18T00:00:00Z |  5 |      5 |
| 72836 | 2016-12-24T00:00:00Z | 2018-09-10T00:00:00Z |  6 |      6 |
| 03679 | 2017-01-24T00:00:00Z | 2017-10-14T00:00:00Z |  7 |      7 |
| 43527 | 2017-02-12T00:00:00Z | 2017-01-15T00:00:00Z |  8 |      8 |
| 03138 | 2017-02-26T00:00:00Z | 2017-01-30T00:00:00Z |  9 |      9 |
| 89758 | 2017-03-29T00:00:00Z | 2018-04-12T00:00:00Z | 10 |      1 |
| 86377 | 2017-04-14T00:00:00Z | 2018-10-07T00:00:00Z | 11 |      2 |
| 49169 | 2017-04-28T00:00:00Z | 2017-04-21T00:00:00Z | 12 |      3 |
| 45523 | 2017-05-03T00:00:00Z | 2017-05-07T00:00:00Z | 13 |      4 |

SQL Fiddle