【发布时间】:2011-08-18 13:45:31
【问题描述】:
我有一个约 200k 记录表 dat 的人及其识别数据以及测试日期和结果,这是一个虚拟版本:
+----+---------+----------+------------+----------+------------+--------+
| id | surname | forename | dob | SchoolID | testDate | result |
+----+---------+----------+------------+----------+------------+--------+
| 1 | Smith | Mary | 1980-04-11 | NULL | 2005-10-12 | 14.32 |
| 2 | Smith | Mary | 1980-04-11 | 1234 | 2007-03-02 | 18.1 |
| 3 | Jones | Kim | 1978-10-24 | 4657 | 2002-04-14 | 24.31 |
| 4 | Jones | Kim | NULL | 4567 | 2002-10-08 | 19.02 |
| 5 | Roberts | Kim | 1978-10-24 | 4567 | 2003-12-18 | 14.19 |
| 6 | Roberts | Kim | 1978-10-24 | 4567 | 2005-02-11 | 18.26 |
+----+---------+----------+------------+----------+------------+--------+
我想找出参加过多次测试的人,并创建一个新列uniqueID,为独特的人提供一个新的ID。遗憾的是,我的数据库不是很整齐,所以我需要使用几个标准将这些记录分成不同的个体:
- 姓、名和出生日期相同(因为 SchoolID 经常丢失或错误)
- surname、forname 和 SchoolID 相同(因为有时不输入 DOB,或者 输入错误)
- forename、dob 和 SchoolID 相同(人们有时会结婚)
- 等
在上面的示例中,表 Mary Smith 和 Kim Roberts nee Jones 中只有两个独特的人,所以这个 uniqueID 列最终应该是:
+----+----------+
| id | uniqueID |
+----+----------+
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
| 4 | 2 |
| 5 | 2 |
| 6 | 2 |
+----+----------+
虽然我已经涉足 MySQL 几年了,但我仍然是初学者。我已经搜索和尝试了几天,到目前为止我已经做到了:
SELECT surname, forename, SchoolID
FROM dat
GROUP BY CONCAT(surname, forename, SchoolID);
这是第二个标准,例如,(我计划在新表中提供一个自动递增键,然后作为唯一 ID 重新加入),但我对这些多个标准不太了解,因此非常感谢您的帮助!
谢谢 尼克
【问题讨论】:
-
你们有没有想过将 SS# 添加到表格中以轻松识别人?
-
这应该是 SchoolID 的用途。可悲的是,在现实生活中它并没有成功,因为经常没有输入,人们被重新发行了新的(甚至同样的号码被多次发行)。
-
如果有人结婚了,换了一个新姓,你想怎么匹配那个人?