0

我在 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 rank 函数中。

4

1 回答 1

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小提琴

于 2017-10-19T09:39:42.477 回答