2017-02-10 114 views
0

如果我的行话已关闭,请原谅我。我还在学习!根据多列查找具有不同ID的重复行

我刚开始使用Teradata,说实话一直很有趣。然而,我遇到了一段让我难倒了一段时间的路障。

我成功地选择一个表从看起来像一个数据库:

ID  service  date name 

1  service1 1/5/15 john  
2  service2 1/7/15 steve 
3  service3 1/8/15 lola 
4  service4 1/3/15 joan 
5  service5 1/5/15 fred   
6  service3 1/3/15 joan 
7  service5 1/8/15 oscar 

现在我想再次搜索数据库找到任何重复的ID(例如:看是否服务service1的日期为1/5/15,名称为john,存在于具有不同ID的另一行上。)

起初,我做了这样的事情:

SELECT ID, service, date, name 
FROM table 
WHERE table.service = ANY(service1, service2, service3, service4, service5, service3, service5) 
AND table.date = ANY('1/5/15', '1/7/15, '1/8/15', '1/3/15', '1/5/15', '1/3/15', '1/8/15') 
AND table.name = ANY('john', 'steve', 'lola', 'joan', 'fred', 'joan', 'oscar'); 

但是,这给了我比我想要的更多的行。

例如:

ID  service  date  name 
92  service3 1/8/15 steve 

是对我没有用的,因为我要寻找的是有服务,日期和名称的任何在上表中的其他ID的相同的组合标识。

像这样将有利于:

ID  service  date  name 
609  service3 1/8/15 lola 

,因为它比ID 3.

我很好奇,看看它是可以治疗的三列(服务,日期,名称相匹配)作为一个矢量,也许选择那些匹配它的行?

...... 
WHERE (table.service, table.date, table.name) = ANY((service3,1/8/15,lola), (service1, 1/5/15, john), ...etc) 

我的Teradata被降权了,所以我还没有尝试上面的例子。尽管如此,任何想法/反馈都非常感谢!

+0

从哪里来预计输出中'609'的ID值? –

+0

上表不是我的实际表格;它看起来像它,所以我没有泄露任何机密信息。但无论哪种方式,我正在寻找的这些重复项是很大数量行的一小部分;我不知道有多少行,我只知道我无法加载它们 – Sam

+0

我在下面给了你一个答案,试试看,如果它不起作用,请发表评论。 –

回答

0

下面的查询可能是你想要实现的。这将选择service,datename组合出现多次的ID。

SELECT t1.ID 
FROM yourTable t1 
INNER JOIN 
(
    SELECT service, date, name 
    FROM yourTable 
    GROUP BY service, date, name 
    HAVING COUNT(*) > 1 
) t2 
    ON t1.service = t2.service AND 
     t1.date = t2.date AND 
     t1.name = t2.name 
+0

我认为这是诀窍;谢谢你的帮助,非常感谢! – Sam

0

除非您绝对必须,否则不要在您的查询中硬编码值。取而代之的是,您已经编写并加入的查询。

SELECT dupes.* 
FROM (your query) yourquery 
JOIN table dupes 
    ON yourquery.service = dupes.service 
AND yourquery.date = dupes.date 
AND yourquery.name = dupes.name 
1

这是一个窗总结一个简单的任务:

SELECT * 
FROM tab 
QUALIFY 
    COUNT(*) OVER (PARTITION BY service, date, name) > 1 

这计数与值(如添Biegeleisen的派生表)的相同组合的行数,但不同于标准总结它使所有行。 QUALIFY是一个很好的Teradata语法扩展,以避免派生表。