我很遗憾不得不处理包含特定记录副本的数据库,我正在寻找一种快速说法“获取人口最多的记录并更新重复项以匹配它”。
从那里我可以选择不同的记录并获得一组有用的记录。
有什么想法吗?
如果有帮助,主要是名称和地址......
这里有很多问题,所以我会再加一点:
首先,我想拉出最“填充”不是最“流行”的,这意味着具有最多值的行不是空的。
一旦我有了这个集合(这很简单,因为在我的情况下是id的匹配),我可以填充其他行中的缺失值。
我不想销毁数据,我只打算根据准确的匹配更新数据(例如通过id)。
我目前的问题是弄清楚哪一组行中填充最多的字段,说过自发布此问题后我发现了一种不同的方法来解决我的更大问题,即发送到远程服务器的内容但我仍然有兴趣知道解决方案可能是什么。
示例数据可能看起来像这样......
id name addr1 addr2 ect
1 fred 1 the street Some town ...
1 fred null null null
如果一个表格中充满了像这样的匹配对,我想找到这些对,然后抓住那个带有信息的对,并在另一行中有空值的地方插入这些值。
答案 0 :(得分:0)
请注意,您可能会在此处销毁数据。只是因为一行填充的列数较少并不意味着它在 填充的列中不太准确。
我假设重复项由名为“name”的列确定。您需要根据重复项的定义进行调整。此外,既然你没有就如何处理“人口最多”的关系给出任何规则,我只选择了id最低的行。
UPDATE
T1
SET
col_1 = T2.col_1,
col_2 = T2.col_2,
....
FROM
My_Table T1
INNER JOIN My_Table T2 ON
T2.name = T1.name AND
T2.id =
(
SELECT TOP 1
T3.id
FROM
My_Table T3
WHERE
T3.name = T1.name
ORDER BY
CASE WHEN col_1 IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN col_2 IS NOT NULL THEN 1 ELSE 0 END +
... DESC,
id ASC
)
编辑:我只是重新阅读你的问题而你提到,“从那里我可以选择不同的记录并获得一组有用的记录。”如果那是你真正想要的,那就不要费心去更新其他行了,只需在第一时间选择你想要的那些,并保留其他所有行:
SELECT
T1.id,
T1.name,
T1.col_1,
T1.col_2,
...
FROM
My_Table T1
WHERE
T1.id =
(
SELECT TOP 1
T2.id
FROM
My_Table T2
WHERE
T2.name = T1.name
ORDER BY
CASE WHEN T2.col_1 IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN T2.col_2 IS NOT NULL THEN 1 ELSE 0 END +
... DESC,
T2.id ASC
)