适当的排名

时间:2019-03-05 15:10:17

标签: sql sql-server rank

我有这种数据:

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分配给最近的合同,在其他情况下将其分配给最近的合同(?)。 有提示吗?

1 个答案:

答案 0 :(得分:3)

您的排名是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()