我有以下数据:
表:
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)
答案 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)