使用DENSE_RANK分割数据集

时间:2014-05-07 13:23:05

标签: sql tsql window-functions

我试图用下面的方法拆分数据集,所以我可以根据另一个表中的值来分配一个值。

这是我到目前为止使用DENSE_RANK()尝试实现此目的的代码。

declare @t1 table (ID char(3) not null,Name char(5) not null)
insert into @t1(ID,  Name) values
('ID1','Test1'),
('ID2','Test1'),
('ID3','Test2')

declare @t2 table (CusID char(3) not null,counter int not null)
insert into @t2(CusID,  counter) values
('A1', 100),
('A2', 200),
('A3', 300)


select ID,Name,'ExampleST' +
       RIGHT('00000' + CONVERT(varchar(4),
             DENSE_RANK() OVER (ORDER BY Name)+ counter)
       ,5) as NewID
from @t1
CROSS JOIN @t2
order by ID

返回:

ID  Name    NewID
ID1 Test1   ExampleST00101
ID1 Test1   ExampleST00201
ID1 Test1   ExampleST00301
ID2 Test2   ExampleST00102
ID2 Test2   ExampleST00202
ID2 Test2   ExampleST00302
ID3 Test3   ExampleST00103
ID3 Test3   ExampleST00203
ID3 Test3   ExampleST00303

我想要它返回

ID  Name    NewID
ID1 Test1   ExampleST00100
ID1 Test1   ExampleST00100
ID1 Test1   ExampleST00100
ID2 Test2   ExampleST00200
ID2 Test2   ExampleST00200
ID2 Test2   ExampleST00200
ID3 Test3   ExampleST00300
ID3 Test3   ExampleST00300
ID3 Test3   ExampleST00300

如何做到这一点?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您不需要dense_rank(),您只需要每个名称的计数器max()

select ID, Name,
       ('ExampleST' +
        right('00000' + cast(dense_rank() over (order by name) * 100 as varchar(255)),
              5) as NewID
from @t1 cross join
     @t2
order by ID;