【问题标题】:Eliminating Duplicate records based on priority table基于优先级表消除重复记录
【发布时间】:2021-02-11 15:15:12
【问题描述】:

我有 2 个表,1 个(产品)有以下数据

orderName       Skey
3.0             100
Pen             100
Scale           101
Pen             101
Bottle          102

优先级表第二个有以下数据

orderName       Priority
Scale           1
Pen             2
Bottle          3
3.0             4

我想根据优先级表中存在的订单优先级从产品表中删除重复值(skey)。

输出应该是

orderName   Skey
Pen         100
Scale       101
Bottle      102

我不确定如何使用单个查询来做到这一点。 请帮忙

【问题讨论】:

    标签: sql sql-server database tsql join


    【解决方案1】:

    这是一个完整的工作示例:

    DECLARE @Products TABLE
    (
        [orderName] VARCHAR(24)
       ,[Skey] INT
    );
    
    DECLARE @priority TABLE
    (
        [orderName] VARCHAR(25)
       ,[Priority] TINYINT
    );
    
    INSERT INTO @Products ([orderName], [Skey])
    VALUES ('3.0', 100)
          ,('Pen', 100)
          ,('Scale', 101)
          ,('Pen', 101)
          ,('Bottle', 102);
    
    INSERT INTO @priority ([orderName], [Priority])
    VALUES ('Scale', 1)
          ,('Pen', 2)
          ,('Bottle', 3)
          ,('3.0', 4);
    
    
    SELECT TOP 1 WITH TIES P.[orderName], P.[Skey]
    FROM @Products P
    INNER JOIN @priority PR
        ON P.[orderName] = PR.[orderName]
    ORDER BY ROW_NUMBER() OVER (PARTITION BY P.[Skey] ORDER BY PR.[Priority]);
    

    【讨论】:

    • OP 需要“删除重复值”,而不是选择。
    【解决方案2】:
    WITH cte AS (SELECT Product.*, 
                        ROW_NUMBER() OVER (PARTITION BY Skey 
                                           ORDER BY (SELECT Priority
                                                     FROM priority
                                                     WHERE Product.orderName = priority.orderName)) rn
                  FROM Product)
    DELETE
    FROM cte
    WHERE rn > 1;
    

    fiddle

    PS。 priority 表中的 orderName 列必须定义为唯一的。 Priority 列也需要唯一性。

    【讨论】:

      【解决方案3】:

      使用“Partition by key1 Order By key2”按分区对数据进行排序。然后从每个分区中选择第一项。代码来了

      create table Product(orderName varchar(100),Skey int);
      insert into Product values('3.0',100);
      insert into Product values('Pen',100);
      insert into Product values('Scale',101);
      insert into Product values('Pen',101);
      insert into Product values('Bottle',102);
      
      create table Priority(orderName  varchar(100),Priority int);
      insert into Priority values('Scale',1);
      insert into Priority values('Pen',2);
      insert into Priority values('Bottle',3);
      insert into Priority values('3.0',4);
      
      select orderName,skey FROM
      (
          select p.orderName,skey,pr.Priority,row_number() over(partition by skey order by pr.Priority) as rowNum 
          from Product p join Priority pr on p.orderName=pr.orderName 
      ) t where t.rowNum = 1
      

      【讨论】:

        猜你喜欢
        • 2014-07-31
        • 2020-01-02
        • 1970-01-01
        • 1970-01-01
        • 2021-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多