【问题标题】:SQL find duplicate entry and insert into new columnSQL查找重复条目并插入新列
【发布时间】:2010-10-06 01:12:43
【问题描述】:

我有一个包含以下列的表格:日期、电话、姓名和事件。

我需要一个查询,它首先识别重复的电话条目,然后将日期较早的那个人的名称分配给事件列。

【问题讨论】:

  • 什么版本的 SQL Server?另外,您想将原始记录中的Name 放入重复记录的Event 中吗?另外,您如何看待重复的电话号码? 555-555-5555 和 (555) 555-5555 一样吗?
  • 如果电话栏是重复的,我希望它采用最早日期的记录并将其名称放入具有较旧日期的重复的事件列中......希望这是有道理的。与 1234567 中的重复,与 1234567 相同

标签: sql sql-server tsql sql-server-2000 sql-update


【解决方案1】:

用途:

UPDATE x
   SET x.event = y.name
  FROM YOUR_TABLE x
  JOIN YOUR_TABLE y ON y.phone = x.phone
  JOIN (SELECT t.phone,
               MIN(t.date) As min_date
          FROM YOUR_TABLE t
      GROUP BY t.phone
        HAVING COUNT(*) > 1) z ON z.phone = y.phone
                              AND z.min_date = y.date
                              AND z.min_date < x.date

但如果最小值重复,则不解决。

【讨论】:

  • 更新记录较早日期,我认为@sqlman 想要更新较早日期的记录。
  • @OMG Ponies - 我对你的问题有点困惑,但后来我意识到他似乎在我编辑了他的问题后做出了回应,但我向你保证,评论首先出现 :) 你的查询用较晚的日期更新记录,但我认为他希望将最早记录中的 Name 放入较晚记录的 Event 中,而您的查询只是使记录的事件和名称相同。不过,@sqlman 想要什么我可能完全错了,我的大脑今晚似乎无法正常工作。
  • @LittleBobbyTales “但我以为他想把最早记录的名字放到后来记录的事件中”——这是正确的
  • @OMG 小马——如此接近!假设表名称为Events,查询分析器给了我一个The table 'Events' is ambiguous. 错误(虽然这是在2005 年),所以我将更新语句更改为UPDATE x...,这似乎工作得很好。
  • @OMG Ponies - Huzzah!在我的测试台上工作。我要添加的 only 警告是 @sqlman 可能想要修改查询的 z.phone = y.phone 部分以去除电话号码中的 (、) 和 - 字符,如果它们只是如果这是一个问题,想比较实际数字,但它的核心是有效的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 2018-11-06
相关资源
最近更新 更多