如何在SQL Server/Spark/Python中去除冗余记录并保留完整唯一记录
如何高效去除user_list表中的冗余记录?
原始表结构与数据
我有一张user_list表,结构和数据如下:
| Row | User | Given Name | Family Name | Address | ZIP |
|---|---|---|---|---|---|
| 1 | 1 | John | Smith | 1 Main Rd | 1000 |
| 2 | 1 | John | 1 Main Rd | 1000 | |
| 3 | 1 | John | 1000 | ||
| 4 | 1 | John | 0800 | ||
| 5 | 1 | Johnny | 1000 | ||
| 6 | 2 | Tom | Lock | 2 Main Rd | 1001 |
| 7 | 2 | Tommy | 2 Main Rd | 1001 | |
| 8 | 2 | Tom | L | 2 Main Rd | 1001 |
| 9 | 2 | 1001 | |||
| 10 | 3 | Oak | 4 Main Rd | 1004 | |
| 11 | 3 | Tim | 4 Main Rd | 1004 |
需求说明
需要去除表中的冗余记录——即重复已有信息但包含更多空值的记录(比如行2、3是行1的冗余,行9是行6的冗余),保留最完整的唯一记录。期望输出结果如下:
| Row | User | Given Name | Family Name | Address | ZIP |
|---|---|---|---|---|---|
| 1 | 1 | John | Smith | 1 Main Rd | 1000 |
| 4 | 1 | John | 0800 | ||
| 5 | 1 | Johnny | 1000 | ||
| 6 | 2 | Tom | Lock | 2 Main Rd | 1001 |
| 7 | 2 | Tommy | 2 Main Rd | 1001 | |
| 8 | 2 | Tom | L | 2 Main Rd | 1001 |
| 10 | 3 | Oak | 4 Main Rd | 1004 | |
| 11 | 3 | Tim | 4 Main Rd | 1004 |
注意:行10和11需要同时保留,二者的有效字段并不重复。
实现环境与初始思路
希望在SQL Server (2014)、Spark或Python中实现该需求。
我的初始思路是:统计每行的空值数量,基于User字段自连接表并对比各字段,标记冗余记录后删除,但这是一种暴力方法,想了解是否有更高效的实现方式。
建表与插入数据代码
CREATE TABLE user_list ( rown INT, username INT, given_name VARCHAR(50), family_name VARCHAR(50), address VARCHAR(50), zip varchar(10) ) INSERT INTO user_list (rown, username, given_name, family_name, address, zip) VALUES (1,1,'John', 'Smith', '1 Main Rd', '1000'), (2,1,'John', NULL, '1 Main Rd', '1000'), (3,1,'John', NULL, NULL, '1000'), (4,1,'John', NULL, NULL, '0800'), (5,1,'Johnny', NULL, NULL, '1000'), (6,2,'Tom', 'Lock', '2 Main Rd', '1001'), (7,2,'Tommy', NULL, '2 Main Rd', '1001'), (8,2,'Tom', 'L', '2 Main Rd', '1001'), (9,2,NULL, NULL, NULL, '1001'), (10,3,NULL, 'Oak', '4 Main Rd', '1004'), (11,3,'Tim', NULL, '4 Main Rd', '1004');
内容的提问来源于stack exchange,提问作者woiya
相关产品推荐
相关产品推荐

