我在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。
答案 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;