根据多个列查找具有不同ID的重复行

时间:2017-02-10 00:33:40

标签: sql teradata

如果我的行话已经关闭,请原谅我。我还在学习!

我刚开始使用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(例如:查看具有名称john的日期为1/5/15的服务service1是否存在于具有不同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。

这样的事情会很有利:

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现在已经关闭,所以我还没有尝试上面的例子。不过,非常感谢任何想法/反馈!

3 个答案:

答案 0 :(得分:1)

对于窗口聚合来说,这是一项简单的任务:

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

这会计算具有相同值组合的行数(如Tim Biegeleisen的派生表),但与标准聚合不同,它会保留所有行。 QUALIFY是一个很好的Teradata语法扩展,可以避免派生表。

答案 1 :(得分:0)

以下查询可能是您要实现的目标。这会选择nameSELECT 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 // this would work, but I'd prefer to avoid parsing something I // happen to already know contains valid json val rawJsonStr = "..." val spliced = JField("foo", parse(rawJsonStr)) 的组合出现多次的ID。

{{1}}

答案 2 :(得分: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