我是sql的初学者,我希望我的帖子很清楚。
所以我有一张桌子(见图片),我的SalesMen链接到合同。我希望能够根据合同对每个SalesMen进行排名。因此,如果今天在合同001上我有马丁作为唯一的SalesMan他应该有'1'作为排名。但是如果有一天马丁被解雇了,新人就是弗兰克。然后马丁将排名第2,弗兰克排名第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
。