2017-02-22 36 views
0

我有以下的TSQL表查找对序列(还有其他的列太多,但没有标识列或主键列):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) 

请注意,Oid的2比赛没有包括的Oid 6,由于一对6有字母“G”为好。

是否有可能创建一个查询而不使用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,4和7,如果包括2),它说它匹配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,4和7,如果包括2),它说它匹配4次(对于2,4,6,7)。这是匹配我需要做的,而不是单个字母匹配。由于6有'F'和'G',它不应该被选中。对不起,如果帖子不清楚 – hss