TSQL :

2017-02-22 2 views
0

내가 TSQL에서 다음 표 한 표에 PAIR 순서 찾기 (다른 열이 너무있다하지만 ID 열 또는 기본 키 열) :TSQL :

Oid Cid 
    1 a 
    1 b 
    2 f 
    3 c 
    4 f 
    5 a 
    5 b 
    6 f 
    6 g 
    7 f 

그래서 위의 예에서 나는 하시겠어요 "한 쌍이된다"로 시드의 열 값을 볼 때 다음의 Oid 중복 있음을 강조 :

Oid: 
1 (1 matches Oid: 5) 
2 (2 matches Oid: 4 and 7) 

6 쌍의 문자 'G'뿐만 아니라이 있기 때문에 Oid에 2 일치, Oid에 6을 포함하지 않았 음을 유의하시기 바랍니다.

While 루프를 사용하지 않고 쿼리를 생성하여 위와 같은 "Oid"를 강조 표시 할 수 있습니까? 데이터베이스에 다른 일치 개수가 몇 개나 있습니까? 이 두 열과 관련된 데이터 집합 내의 패턴을 찾으려고합니다. 미리 감사드립니다. 어쩌면 이것은 다음처럼

+0

는 한 쌍의 일치 내가없는 개인을 할 필요가 있다고주의 사항 문자 일치. 따라서 원하는 결과 집합에서 Oid = 2에 대해 Oid 6에 일치하는 문자를 포함해서는 안됩니다. 문자 'G'도 있으므로. 희망이 분명해질 것입니다. – hss

답변

2

는 가공 한 예이다 - 설명 주석을 참조하십시오

--First set up your data in a temp table 
declare @oidcid table (Oid int, Cid char(1)); 
insert into @oidcid values 
(1,'a'), 
(1,'b'), 
(2,'f'), 
(3,'c'), 
(4,'f'), 
(5,'a'), 
(5,'b'), 
(6,'f'), 
(6,'g'), 
(7,'f'); 

--This cte gets a table with all of the cids in order, for each oid 
with cte as (
    select distinct Oid, (select Cid + ',' from @oidcid i2 
          where i2.Oid = i.Oid order by Cid 
          for xml path('')) Cids 
    from @oidcid i 
) 
select Oid, cte.Cids 
from cte 
inner join ( 
    -- Here we get just the lists of cids that appear more than once 
    select Cids, Count(Oid) as OidCount 
    from cte group by Cids 
    having Count(Oid) > 1) as gcte on cte.Cids = gcte.Cids 
-- And when we list them, we are showing the oids with duplicate cids next to each other 
Order by cte.Cids 
0
select o1.Cid, o1.Oid, o2.Oid 
    , count(*) + 1 over (partition by o1.Cid) as [cnt] 
from table o1 
join table o2 
    on o1.Cid = o2.Cid 
and o1.Oid < o2.Oid 
order by o1.Cid, o1.Oid, o2.Oid 
+0

@paparazzi에 응답 해 주셔서 감사합니다. 이 솔루션은 Oid 2에 대한 정답을 제공하지 않습니다. 'F'와 3 ​​회 (2를 포함하는 경우 2, 4 및 7에 대해) 일치하는 대신 4 번 (2, 4, 6, 7)에 일치한다고 말합니다. 그것은 개인 레터 매칭이 아니라, 내가해야 할 쌍입니다. 6에는 'F'와 'G'가 있기 때문에 선택해서는 안됩니다. 죄송합니다 게시물이 분명하지 않은 경우 – hss

0

: 여기

WITH CTE AS 
(
    SELECT Cid, oid 
    ,ROW_NUMBER() OVER (PARTITION BY cid ORDER BY cid) AS RN 
    ,SUM(1) OVER (PARTITION BY oid) AS maxRow2 
    ,SUM(1) OVER (PARTITION BY cid) AS maxRow 
    FROM oid 
) 
SELECT * FROM CTE WHERE maxRow != 1 AND maxRow2 = 1 
ORDER BY oid 
+0

@ Owain-Esau 응답 주셔서 감사합니다. 이 솔루션은 Oid 2에 대한 정답을 제공하지 않습니다. 'F'와 3 ​​회 (2를 포함하는 경우 2, 4 및 7에 대해) 일치하는 대신 4 번 (2, 4, 6, 7)에 일치한다고 말합니다. 그것은 개인 레터 매칭이 아니라, 내가해야 할 쌍입니다. 6에는 'F'와 'G'가 있기 때문에 선택해서는 안됩니다. 죄송합니다 게시물이 분명하지 않은 경우 – hss