J'utilise SQL Server 2008 R2 et ma structure est la suivante:
create table #temp( deptid int, regionid int)
insert into #temp
select 15000, 50
union
select 15100, 51
union
select 15200, 50
union
select 15300, 52
union
select 15400, 50
union
select 15500, 51
union
select 15600, 52
select deptid, regionid, RANK() OVER(PARTITION BY regionid ORDER BY deptid) AS "RANK",
ROW_NUMBER() OVER(PARTITION BY regionid ORDER BY deptid) AS "ROW_NUMBER",
DENSE_RANK() OVER(PARTITION BY regionid ORDER BY deptid) AS "DENSE_RANK"
from #temp
drop table #temp
Et la sortie est actuellement comme ci-dessous:
deptid regionid RANK ROW_NUMBER DENSE_RANK
--------------------------------------------------
15000 50 1 1 1
15200 50 2 2 2
15400 50 3 3 3
15100 51 1 1 1
15500 51 2 2 2
15300 52 1 1 1
15600 52 2 2 2
Mon exigence est cependant de row_number
plus de regionid
colonne mais en regroupant et non ligne par ligne. Pour mieux expliquer, voici le jeu de résultats souhaité.
deptid regionid RN
-----------------------
15000 50 1
15200 50 1
15400 50 1
15100 51 2
15500 51 2
15300 52 3
15600 52 3
S'il vous plaît laissez-moi savoir si ma question n'est pas claire. Merci.
Réponses:
3 pour la réponse № 1Utilisation dense_rank() over (order by regionid)
pour obtenir le résultat attendu.
select deptid, regionid,
DENSE_RANK() OVER( ORDER BY regionid) AS "DENSE_RANK"
from #temp
Le partitionnement dans une fonction de fenêtre rank / row_number assignera des numéros dans les partitions, vous n’avez donc pas besoin d’utiliser une partition sur regionid pour ordonner les regionid eux-mêmes.