SQL Server 2008 R2:DENSE_RANK()有两列

时间:2017-10-16 07:47:57

标签: sql sql-server sql-server-2008-r2

我有以下数据:

表:

CREATE TABLE tbl1
(
    cola varchar(20),
    colb int
);  

INSERT INTO tbl1 VALUES('AB10029',1),('5023154',17),('05021286',17),('10029',32),('05023154',17),('5021286',17);    

鉴于记录:

Cola        Colb    
------------------
AB10029     1   
5023154     17  
05021286    17  
10029       32  
05023154    17  
5021286     17  

注意:我想给非可匹配的可乐组合(最后一个字符应该相同)的等级为1,colb和匹配组合应该是1,2,3等等。

预期产出:

Cola        Colb    Rn
-----------------------
AB10029     1       1
10029       32      1
5023154     17      1
05023154    17      2
5021286     17      1
05021286    17      2

我的尝试:

SELECT Cola,Colb,
   DENSE_RANK() OVER(PARTITION BY Colb ORDER BY RIGHT(Cola,5)) rn
FROm tbl1
ORDER BY RIGHT(Cola,5)  

3 个答案:

答案 0 :(得分:5)

你可以使用它

SELECT Cola,Colb,
   ROW_NUMBER() OVER(PARTITION BY Colb,RIGHT(Cola,5) ORDER BY RIGHT(Cola,5)) rn
FROm tbl1
order by RIGHT(Cola,5),rn

结果:

Cola                 Colb        rn
-------------------- ----------- --------------------
AB10029              1           1
10029                32          1
05021286             17          1
5021286              17          2
05023154             17          1
5023154              17          2

答案 1 :(得分:2)

注意:您可以使用dense_rank()

执行此操作
SELECT Cola, Colb,
   DENSE_RANK() OVER (PARTITION BY Colb, RIGHT(Cola, 5) ORDER BY Cola DESC) rn
FROm tbl1
ORDER BY RIGHT(Cola, 5);

我认为ROW_NUMBER()对您提供的数据更直观。但是,您可能希望重复项具有相同的值,在这种情况下dense_rank()是正确的方法。

答案 2 :(得分:0)

您应该在分区依据

中使用列名作为分区
SELECT Cola,Colb,RIGHT(Cola,5),
       ROW_NUMBER() OVER(PARTITION BY RIGHT(Cola,5),Colb ORDER BY Colb) rn
FROM tbl1
ORDER BY RIGHT(Cola,5)