如何对销售员在合同上的时间变化进行排名

How to rank salesman changing in the time on a contract

我是 sql 的初学者,我希望我的 post 会很清楚。

所以我有 1 个 table(见图片),我的 SalesMen 链接到合同。 我希望能够对合同中的每个 SalesMen 进行排名。 因此,如果今天在合同 001 上,我将 Martin 作为唯一的销售员,他的等级应该为“1”。 但如果有一天 Martin 被解雇了,而新来的人是 Frank。那么 Martin 将排在第 2 位,Frank 排在第 1 位。

示例:

idContract    idSalesMan    DateLoad
001           Jean          1900-01-01
001           Jean          1900-02-02
001           Jean          1900-03-03
002            Martin       1900-01-01
002            Martin       1900-02-02
002            Frank        1900-03-03

我想要的结果:

idContract    idSalesMan    DateLoad       RankedSalesMan
001           Jean          1900-01-01     1
001           Jean          1900-02-02     1
001           Jean          1900-03-03     1
002            Martin       1900-01-01     2
002            Martin       1900-02-02     2
002            Frank        1900-03-03     1

我做了什么: 第一次尝试: select idContract,IdSalesMan, Row_number() over (partition by IDContract , IDsALESmAN order by IDsALESmAN ) 但它给了我一个常规的 1,2,3,4

然后我试了

select
x.*
,case when x.PrecedingSalesMan = x.SalesMan then
Row_number() over (partition by IDContract , IDsALESmAN order by IDsALESmAN ) 
from(

select idContract,IdSalesMan,

,LAG(CodeAgent,1) over (order by NoContract, idCustomers, kCode_Agent) as PrecedingSalesMan) x

但它也不起作用:(

我不知道该怎么办

看来你只需要 dense_rank()

select *,dense_rank()over(partition by idContract order by idSalesMan) as rn
from table_name

你需要 DENSE_RANK() :

SELECT t.*,
       DENSE_RANK() OVER (PARTITION BY t.idContract ORDER BY t.idSalesMan) AS RankedSalesMan
FROM table t;

您只需要 idContract 在分区子句中。