Sql 获取重复记录并标识最低ID,然后使用最低ID填充ID_to_keep字段

Sql 获取重复记录并标识最低ID,然后使用最低ID填充ID_to_keep字段,sql,sql-server,excel,vba,Sql,Sql Server,Excel,Vba,我想在SQL 2008或VB Excel中编写一个脚本,该脚本将获得所有重复记录,然后在每个重复记录上,它将获得最低id,然后使用该id填充id_to_KEEP字段 原始数据: ID COMPANY_NAME ADDRESS ZIP CODE ID TO KEEP 111 HONDA MOTORS 55 Oklahoma City 4301 143 HONDA LTD. 55 Oklahoma C

我想在SQL 2008或VB Excel中编写一个脚本,该脚本将获得所有重复记录,然后在每个重复记录上,它将获得最低id,然后使用该id填充id_to_KEEP字段

原始数据:

ID      COMPANY_NAME       ADDRESS           ZIP CODE    ID TO KEEP

111     HONDA MOTORS       55 Oklahoma City    4301
143     HONDA LTD.         55 Oklahoma City    4301
1321    HONDA CARS         55 Oklahoma City    4301
231     MITSUBISHI         32 Miami            5532
342     MITSUBASHA         28 Miami            9421
1324    MERCEDES BENZ      21 Toronto          4210
3212    MERCEDES CARS      21 Toronto          4210
432     MERCEDES ELECTRIC  24 Orlando          7732
我想发生的事:

    ID      COMPANY_NAME       ADDRESS           ZIP CODE    ID TO KEEP

    111     HONDA MOTORS       55 Oklahoma City    4301         111
    143     HONDA LTD.         55 Oklahoma City    4301         111
    1321    HONDA CARS         55 Oklahoma City    4301         111
    231     MITSUBISHI         32 Miami            5532
    342     MITSUBASHA         28 Miami            9421
    1324    MERCEDES BENZ      21 Toronto          4210         1324
    3212    MERCEDES CARS      21 Toronto          4210         1324
    432     MERCEDES ELECTRIC  24 Orlando          7732
“保留ID”列已填充,因为这3家本田公司被认为是相同的,因为它们位于相同的地址和邮政编码。在这3家本田公司中,111是最低的ID,因此它是用于填充这3家公司的“保留ID”列的ID

在mercedez-benz的场景中,尽管mercedes electric有相同的第一个名字,但在上面的2家mercedes公司中,它仍然被认为是不同的,因为它有不同的地址和邮政编码


希望有人能帮我做这件事

你只需几步:

    --find how many rows do you have for every adress
SELECT adress, COUNT(*)  as cnt
INTO #temp1
FROM table1
GROUP BY adress
HAVING COUNT(*) > 1 


SELECT MIN(id) AS minID, t.adress
INTO #temp2
FROM table1 AS t
INNER JOIN #temp1 AS T2 ON t.adress = t2.adress 
Group by t.adress;


update t
set minID = t2.minID
--select *
from table1 as t
inner join #temp2 as t2 on t.adress = t2.adress
检查它:

如果您使用的是SQL Server,则可以使用可更新的公共表表达式来执行此操作

WITH CTE AS
(   SELECT  ID, 
            IDTOKEEP,
            MinID = MIN(ID) OVER(PARTITION BY ZIPCODE, ADDRESS),
            [Count] = COUNT(ID) OVER(PARTITION BY ZIPCODE, ADDRESS)
    FROM    T
)
UPDATE  CTE
SET     IDTOKEEP = MinID
WHERE   [Count] > 1;
第一步是使用分析函数来确定使用address/zipcode组合的每一行的最小ID,并确定是否有多行具有该组合。然后更新标识为重复的行:


您可以使用窗口函数在SQL Server中获取结果: -生成一个临时表并填充它 声明@tmp TABLE[ID]小数点28、[COMPANY_NAME]varchar50、[ADDRESS]varchar50、[ZIP CODE]varchar50 插入@tmp ID、[公司名称]、[地址]、[邮政编码] 选择111,‘本田汽车’、‘55俄克拉荷马城’、‘4301’ 工会全部选择143、“本田有限公司”、“俄克拉荷马市55号”、“4301” 联盟全部选择1321、“本田汽车”、“55俄克拉荷马城”、“4301” UNION ALL SELECT 231、MITSUBISHI、32 Miami、5532 联合所有选择342,'三亚沙','迈阿密28','9421' 联盟全部选择1324、梅赛德斯-奔驰、21多伦多、4210 联盟全部选择3212、“梅赛德斯汽车”、“21多伦多”、“4210” UNION ALL SELECT 432、‘梅赛德斯电气’、‘24奥兰多’、‘7732’ -现在获取第一个id,按邮政编码和地址分区。 选择*,通过[ADDRESS]、[ZIP CODE]进行minID超额分配,作为@tmp中的IDTOKEEP

如果您也需要评估公司,并且第一个空格字符完成了这项工作,您可以添加
CASE signcharindex“”,COMPANY_NAME WHEN 1然后leftCOMPANY_NAME,charindex“”,COMPANY_NAME-1 ELSE COMPANY_NAME结束到您的分区BY子句。

感谢您的回复!我试试这个。如果我想要通配符比较呢。导致原始数据中的某些地址不太干净。美国俄克拉荷马城55号由于它与其他城市不完全相同,所以将不被计算在内。然后它开始变得凌乱。。。ZIPCode本身是否足以消除关于它们是否在同一个地方的歧义?否,因为在[BILL_to_CUSTOMER_ID]分区上有不同的地址具有相同的ZipNT=COUNT[BILL_to_CUSTOMER_ID],[BILL_to_CUSTOMER_address_1]Msg 102,级别15,状态1,第6行“=”附近的语法不正确。我犯了那个错误。你认为问题出在哪里?如果看不到完整的查询,很难说,但我猜你在上一列后面缺少了一个逗号。