适当的排名

Appropriate ranking

我有这样的数据:

contract    nr   startdate
   1        12    01-01-2000
   1        12    03-01-2000
   1        22    07-01-2000
   2        77    12-04-2001
   2        78    17-04-2001

我这里的简单目标是对特定合同中的每个数字进行排名,同时考虑开始日期。输出应如下所示:

contract    nr   startdate    my_rank
   1        12    01-01-2000   1
   1        12    03-01-2000   1
   1        22    07-01-2000   2

   2        77    12-04-2001   1
   2        78    17-04-2001   2

几乎所有可能的组合我都试过了,还是想不通。

select dense_rank() over
    (partition by contract order by nr) as my_rank,* from my_data

上面已经足够接近了,问题是在某些情况下,1 被分配给最近的合同,在其他情况下,它被分配给最近的合同 (?)。 有什么提示吗?

您的排名是nr

如果您想按合同日期排名,则需要将其合并。但是这些在合同上是不同的。所以,这需要额外的计算:

select dense_rank() over (partition by contract order by min_startdate) as my_rank,
        d.*
from (select d.*,
             min(startdate) over (partition by contract, nr) as min_startdate
      from my_data d
     ) d;

我不知道您想要 min() 还是 max() 的订购开始日期。