SQL索引匹配以查找重复数据

时间:2014-05-28 12:11:55

标签: sql match

我有下表

Code     Name    Task
aa       jones   DC
ab       dave    DC
aca      james   IF
aca      james   DC
ab       trevor  IF
aa       jones   IF
ag       francis DC
ag       francis IF
af       derek   SF
af       derek   DC

这是一张非常大的表,上面只是一个简单的例子。

所以,我想帮助找到已完成IFSF任务和DC任务的代码和名称。

我希望能够显示一个人触及这两项任务的位置。任务的层次结构是;它以SFIF的形式出现,然后有人会这样做,然后在我们收到DC任务的背后,我希望它们已经完成了同一个人,具有相同的参考编号。 我可以使用INDEX MATCH函数在excel中执行此操作,但由于表的大小,这会占用大量的计算时间。

4 个答案:

答案 0 :(得分:2)

解决此问题的一种方法是将group byhaving一起使用。这是表达这些类型条件的灵活方式:

select code, name
from table t
group by code, name
having sum(case when task = 'DC' then 1 else 0 end) > 0 and
       sum(case when task in ('IF', 'SF') then 1 else 0 end) > 0;

having子句中的每个条件都会计算满足特定条件的行数。例如,第一行计算与'DC'匹配的行,并仅采用至少有一个此类匹配的code, name对。

答案 1 :(得分:0)

SELECT code,name FROM YOUR_TABLE_NAME WHERE task = 'DC' AND (task = 'IF' OR task = 'SF') GROUP BY name

尝试此查询

答案 2 :(得分:0)

select code,name from (select distinct code,name from table1 where task='SF' or task='IF') as temp1 inner join (select distinct code as code2,name as name2 from table1 where task='DC') as temp2 on code=code2,name=name2;

我假设您拥有table1中的表格。该代码构造了两个表temp1temp2temp1包含已分配SF和IF的代码和名称。 temp2包含已分配DC的代码和名称。最后,我将两个表连接在一起,在两个表中查找代码名对。这比在Excel中更快,因为数据库引擎可能会临时索引要连接的列。

实际上,您可以在Excel中执行此操作。您按代码和名称对表进行排序,然后输入以下公式(假设"代码"在A1中):

D2=if(and(A2=A1,B2=B1,D1),true,or(C2="IF",C2="SF"))
E2=if(and(A2=A1,B2=B1,E1),true,C2="DC")

选择这两个单元格,然后双击填充柄(选区右下角的小方块)。然后,选择两列,复制,然后"选择粘贴..." > "值&#34 ;.然后,对列D和E中的值都为真的行进行过滤(Alt-D-F-F)。这就是你想要的结果。如果需要,请选择这些行并复制到新工作表。

或者,您可以按照"来跟踪SQL"组。由Gordon提供的解决方案,这样您就不需要排序:创建两个新列,如上所述,但是:

D1: "D"
E1: "E"
D2=if(or(C2="IF",C2="SF"),1,0)
E2=if(C2="DC",1,0)

然后,"插入" > "数据透视表",拖动"代码"和"姓名"是行标签。拖动" D"要在值下,单击它,"值字段设置...",然后选择" Max"。对" E"执行相同的操作,然后D和E中的1行将是您想要的结果。

答案 3 :(得分:0)

IFSF是同义词的假设下,Gordon Linoff的查询可以变得更容易,并且不能同时存在于相同的Code-Name对,因为OP提供的数据建议

SELECT code, name
FROM   table t
GROUP BY code, name
HAVING SUM(CASE WHEN task IN ('IF', 'SF', 'DC') THEN 1 ELSE 0 END) = 2;