【问题标题】:finding duplicate rows with different IDs based on multiple columns根据多列查找具有不同 ID 的重复行
【发布时间】:2017-06-28 05:16:30
【问题描述】:

如果我的行话不正确,请原谅我。我还在学习!

我刚开始使用 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(例如:查看日期为 1/5/15 且名称为 john 的服务 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 现在已关闭,所以我还没有尝试上面的示例。尽管如此,任何想法/反馈都非常感谢!

【问题讨论】:

  • 您的预期输出中609 的ID 值从何而来?
  • 上表不是我的实际表;它看起来像它,所以我没有透露任何机密信息。但无论哪种方式,我正在寻找的这些重复项都是大量行的一小部分;不知道多少行,只知道加载不出来
  • 我在下面给了你一个答案,试一试,如果它不起作用,请发表评论。

标签: sql teradata


【解决方案1】:

以下查询可能是您想要实现的。这会选择servicedatename 的组合出现多次的 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

【讨论】:

  • 我认为这成功了;非常感谢您的帮助!
【解决方案2】:

这是一个窗口聚合的简单任务:

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

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

【讨论】:

    【解决方案3】:

    除非万不得已,否则不要在查询中对值进行硬编码。相反,请使用您已经编写的查询并加入该查询。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-24
      • 2020-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2020-11-23
      • 2012-09-04
      相关资源
      最近更新 更多