匹配没有身份证ID V2的人

时间:2018-12-11 15:51:41

标签: sql sql-server

我正在尝试将表中的人与名字,姓氏和出生日期匹配

我关注了this answer,这有助于减少与ID的匹配次数早于当前ID的匹配次数(因此3匹配为1,但1不匹配为3)

我遇到1,2和3匹配的问题,结果为

3-2  
3-1  
2-1  

我怎样才能做到3只匹配1个?

这是我正在使用的代码

select  t1.id, t1.date, t1.initial, t1.lastname, t1.birth, min (t2.id)
from    
    YourTable t1
    join    YourTable t2 on t1.date< t2.date --date when the record was created
    and t1.initial= t2.initial
    and t1.lastname= t2.lastname
    and t1.birth= t2.birth
    Group by t1.id, t1.date, t1.initial, t1.lastname, t1.birth

我在先前的问题my previous quesiton中也得到了答复,但经过反复试验,结果发现所用的ID不是数字,而是哈希,因此MIN()并不总是有效。
因此查询的有效输出将是
select t1.id, t1.date, t1.initial, t1.lastname, t1.birth, min (t2.date)
但后来我不知道t2.id

什么是获取t2.id的有效方法?

样本数据:

+-------+------------+-------+------------+-----------+------------+-------------+-----------+
| T1.ID |  T1.Date   | T2.ID |  T2.Date   | T1.Birth  | T1.initial | T1.lastname | T1.gender |
+-------+------------+-------+------------+-----------+------------+-------------+-----------+
| 0x547 | 4/7/2018   | 0xB29 | 11/2/2013  | 8/10/1956 | A          | B           |         1 |
| 0x547 | 4/7/2018   | 0x75D | 11/26/2013 | 8/10/1956 | A          | B           |         1 |
| 0x75D | 11/26/2013 | 0xB29 | 11/2/2013  | 8/10/1956 | A          | B           |         1 |
| 0xD50 | 5/18/2018  | 0xB29 | 11/2/2013  | 8/10/1956 | A          | B           |         1 |
| 0xD50 | 5/18/2018  | 0x75D | 11/26/2013 | 8/10/1956 | A          | B           |         1 |
| 0xD50 | 5/18/2018  | 0x547 | 4/7/2018   | 8/10/1956 | A          | B           |         1 |
| 0x817 | 5/20/2018  | 0xB29 | 11/2/2013  | 8/10/1956 | A          | B           |         1 |
| 0x817 | 5/20/2018  | 0x75D | 11/26/2013 | 8/10/1956 | A          | B           |         1 |
| 0x817 | 5/20/2018  | 0x547 | 4/7/2018   | 8/10/1956 | A          | B           |         1 |
| 0x817 | 5/20/2018  | 0xD50 | 5/18/2018  | 8/10/1956 | A          | B           |         1 |
| 0x013 | 9/28/2018  | 0xB29 | 11/2/2013  | 8/10/1956 | A          | B           |         1 |
| 0x013 | 9/28/2018  | 0x75D | 11/26/2013 | 8/10/1956 | A          | B           |         1 |
| 0x013 | 9/28/2018  | 0x547 | 4/7/2018   | 8/10/1956 | A          | B           |         1 |
| 0x013 | 9/28/2018  | 0x817 | 5/20/2018  | 8/10/1956 | A          | B           |         1 |
| 0x013 | 9/28/2018  | 0xD50 | 5/18/2018  | 8/10/1956 | A          | B           |         1 |
+-------+------------+-------+------------+-----------+------------+-------------+-----------+

1 个答案:

答案 0 :(得分:0)

我设法使用row_number()在分区上使用日期和排名来解决此问题。将此查询放入with中,并在另一个查询中过滤rank = 1的行