【问题标题】:Matching two variables to create a new ID匹配两个变量以创建新 ID
【发布时间】:2014-01-08 17:23:11
【问题描述】:

我正在尝试创建一个 SQL 语句来匹配身份证号或邮政编码,然后分配一个新的身份证号

我最终想要的是“newid”,它可以正确识别前四条记录是同一个人(即使记录 2 的邮政编码不同)。

record  id  postcode  newid
--------------------------
   1    1      1       1
   2    1      2       1
   3    1      1       1
   4    2      1       1
   5    3      3       2

任何建议将不胜感激。

【问题讨论】:

  • 抱歉,您能澄清一下吗?你有 3 个 id 为 1 - 一个 id 为 2 - 其中一个 id 为 1 - 一个的邮政编码为 2,一个 id 为 2 的邮政编码为 1 - 现在我们可以说(如果 id 或 postcode = 1 - 新 id -> 1?? 你是这个意思吗?)
  • 不完全是,因为列之间的数字代码不一定相同(数字用于说明)。邮政编码值可以是任何值,例如A,B,A,A,C 或 4,5,4,4,6。该语句需要“记住”已根据 id 列分配的 ID。
  • 我仍然不明白 - 远离列、表格等。你实际上想要实现什么 - 从你所展示的没有独特的模式 - 再添加几行到你的例如,如果你可以
  • 我正在尝试将属于同一个人的记录合并在一起。所以语句需要识别记录 1 到 4 是相同的,因为要么是 id 号要么是邮政编码匹配。假设邮政编码列是 A,B,A,A,C。记录 4 与记录 1 和 2 具有相同的邮政编码,因此应为其分配与记录 1 到 3 相同的 ID 号。
  • 按照这个逻辑,为什么不应该将记录 1-3 与记录 4 的 id 匹配呢?即,为什么记录 1-3 不应该接收 newid 值 2 而不是相反?

标签: sql merge match postal-code


【解决方案1】:

根据您的示例进行:

SELECT RECORD, 
       (SELECT MIN (ID)
        FROM users u2
        WHERE users.id IN (u2.id, u2.postcode)
        OR users.postcode in (u2.id, u2.postcode)
       ) AS newid

FROM users

结果如下:

RECORD     NEWID
------------------
   1         1
   2         1
   3         1
   4         1
   5         3

这里是SQLFiddle

【讨论】:

  • 谢谢,但是当我使用一些带有文本邮政编码的数据时,记录 4 会获得一个新的 ID 号,即使它与记录 1 和 3 具有相同的邮政编码。sqlfiddle.com/#!2/03658f/1/0
  • 非常感谢。同样,我想匹配日期,但允许三个部分中的两个(dd、mm 或 yy)相同。但是,此示例中的记录 7 的 ID 为 1,但应该有自己的编号(日期为 1900 年 1 月 1 日)。为什么这个记录与其他记录匹配? sqlfiddle.com/#!2/e8535/1/0
  • @user2964644 您将日期部分与 record id 进行匹配。在这种情况下,您将 1 月 1 日与 1 的记录 id 进行匹配。这是一个匹配项。
  • 你的意思是把 1 月 1 日当作数字 1 对待吗?
  • 您正在匹配一组三个值中的任意两个:record、mm、dd。第一行的 record 值为 1。第七行的 mmdd 值都是 1。我不太清楚你为什么'正在对照 record 检查 mmdd 值,但我不知道您的业务需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
  • 2016-11-13
  • 2014-12-07
  • 1970-01-01
相关资源
最近更新 更多