我有一个数据库,其中每个实体都有一个唯一的ID,但最近所有的实体名称都被更改(不是以相同的方式)以提高可读性。这些更改在不同名称中不是标准的,因ID而异。这使得很多摘要报告如下所示:
ID Name Total for the year
3011 Joesmith 3000
3011 Joe Smith 1000
5024 DBS 400
5024 Deborah Smith 150
各行可能类似于:
ID Name Transaction Date
3011 Joesmith 2000 January 1, 2017
3011 Joesmith 1000 January 2, 2017
3011 Joe Smith 500 February 1, 2017
3011 Joe Smith 500 February 5, 2017
最好的方法是纠正旧条目以匹配新条目,还是只显示任何匹配ID的新名称?在一天结束时,我们可以通过使用ID获得我们感兴趣的摘要,但最终我们希望通过查看我们的名称来解释这些摘要。
我们正在查看大约1000个具有不同名称的ID,总共可能有50,000行。
答案 0 :(得分:2)
选项A:使用每个ID的最新名称更新您的表格:
UPDATE A
SET A.Name = B.Name
FROM YourTable A
JOIN (SELECT ID, Name, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date DESC) RN
FROM YourTable) B ON A.ID = B.ID AND B.RN = 1
选项B:更改报表以加入表格以获取每个ID的最新名称。这是一种方式:
SELECT A.ID, B.Name, SUM(Transaction) TotalForTheYear
FROM YourTable A
JOIN (SELECT ID, Name, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date DESC) RN
FROM YourTable) B ON A.ID = B.ID AND B.RN = 1
GROUP BY A.ID, B.Name
这些使用ROW_NUMBER()
,这在所有DBMS(主要是MySQL)中都不可用。如果ROW_NUMBER()
不可用,还有其他方法可以编写它。 UPDATE
语法也可能有所不同。始终在您的问题中标记或提及您的DBMS选项。
答案 1 :(得分:2)
此处的解决方案基于您希望设置为具有空格的名称的假设,并且您在帖子中列出的每个ID只有两个名称变体。它还假定MS SQL Server没有标记DBMS
如果您想使用没有空格的名称,请在>0
子句中将=0
更改为WHERE
UPDATE your_table
SET your_table.Name = a.Name
FROM (
SELECT DISTINCT
ID,
Name
FROM your_table
) a
WHERE CHARINDEX(' ', a.Name) > 0 AND
your_table.ID = a.ID
我建议你在桌子的副本上测试一下
答案 2 :(得分:1)
虽然您可以更新数据,但更好的方法似乎是修复您的数据库,因此名称只能使用ID一次。然后,您应该从事务表中删除该名称,然后返回到具有该名称的实体。我意识到这可能不实用,但它比修复非规范化数据更正确