SQL Server:创建一个特定的ID计数器

时间:2016-09-01 07:11:26

标签: sql sql-server increment

我在MS SQL Server中有以下视图:

TestR   SW  ID
--------------
Test1   A   P1
Test1   A   P2
Test2   B   P1
Test2   B   P2
Test5   A   P1
Test5   A   P2
Test5   B   P1
Test5   B   P2
Test3   A   P3
Test3   A   P4
Test3   B   P3
Test3   B   P4
Test4   A   P5
Test6   A   P1

正如您在Test1,2,5中看到的那样,我有不同的SW,但ID相同(P1; P2)。在Test3中,我有不同的SW集成和ID(P3; P4)两次。 Test4只有一个SW和ID。 Test6类似于Test1,2,5,但它只有ID P1。

我想要完成的是集成特定的增量IDCount: 作为示例,我希望在 Testn.ID = Testn.ID 时不增加IDCount,因为它们具有相同的ID。在Test3中我增加一个,因为ID不适合Test1,Test2 ......在Test4中我也必须增加。在Test6中,ID P1出现在Test1,Test2中,但数据集不相同。列SW对IDCount没有影响。

IDCount    TestR   SW  ID
-------------------------         
1          Test1   A   P1
1          Test1   A   P2
1          Test2   B   P1
1          Test2   B   P2
1          Test5   A   P1
1          Test5   A   P2
1          Test5   B   P1
1          Test5   B   P2
2          Test3   A   P3
2          Test3   A   P4
2          Test3   B   P3
2          Test3   B   P4
3          Test4   A   P5
4          Test6   A   P1

我希望你能理解我的问题,我会感激一些帮助。目前我使用了突击队:Rank()OVER(ORDER BY TestR)AS IDCount但这只适用于Test3。我认为主要问题是检查不同的TestR是否具有相同的ID。

1 个答案:

答案 0 :(得分:0)

按setcode排序,这是有序不同ID的串联

with tbl(TestR,SW,ID) as(
    select * 
    from (
        values
         ('Test1','A','P1')
        ,('Test1','A','P2')
        ,('Test2','B','P1')
        ,('Test2','B','P2')
        ,('Test5','A','P1')
        ,('Test5','A','P2')
        ,('Test5','B','P1')
        ,('Test5','B','P2')
        ,('Test3','A','P3')
        ,('Test3','A','P4')
        ,('Test3','B','P3')
        ,('Test3','B','P4')
        ,('Test4','A','P5')
        ,('Test6','A','P1')
    ) t(TestR,SW,ID)
)
, sets  as (
    select  t1.*, 
         ( select distinct '-'+t2.ID 
           from tbl t2 
           where t2.TestR = t1.TestR
           order by '-'+t2.ID 
           for xml path('')
          ) setcode
    from tbl t1 
)
select dense_rank() over(order by setcode) as IDCount, TestR, SW, ID, setcode
from sets
order by dense_rank() over(order by setcode),TestR;

修改
有点不同的顺序,按组中的min(TestR)

with ...
)
, sets  as (
    select  t1.*, 
         ( select distinct '-'+t2.ID 
           from tbl t2 
           where t2.TestR = t1.TestR
           order by '-'+t2.ID 
           for xml path('')
          ) setcode
    from tbl t1 
), keys as (
    select *, min(TestR) over(partition by setcode) key1
    from sets
)
select dense_rank() over(order by key1) as IDCount, TestR, SW, ID, setcode
from keys
order by dense_rank() over(order by key1),TestR;