【问题标题】:Remove duplicate value on one column based on value of other column根据另一列的值删除一列上的重复值
【发布时间】:2021-09-12 03:26:09
【问题描述】:

我有一张名为Table1 的表格,见下文

PRODUCT    CUSTOMER               COMP
DICE       DAVES PET SHOP         Billed
DICE       CLAXTONS               ToT
CARDS      VIEWSONIC              NITS
CARDS      NORTHERN LIGHTS        Billed
CARDS      NORTHERN LIGHTS        NITS
BOX        TABLEAU                Billed
BOX        TABLEAU                ToT

有些值在 CUSTOMER 字段中有重复项,但如果重复,它将始终在至少一个 COMP 部分中包含 Billed,因此我希望生成的查询仅返回 COMP 中的值,其中重复项为 Billed,因此结果表看起来像

PRODUCT    CUSTOMER               COMP
DICE       DAVES PET SHOP         Billed
DICE       CLAXTONS               ToT
CARDS      VIEWSONIC              NITS
CARDS      NORTHERN LIGHTS        Billed
BOX        TABLEAU                Billed

这是我尝试过的 SQL

SELECT * 
FROM Table1
WHERE COMP = 'Billed'
UNION ALL
SELECT Table1_A.PRODUCT, Table1_A.CUSTOMER, Table1_A.COMP
FROM Table1 Table1_A
LEFT JOIN (
    SELECT * 
    FROM Table1 
    WHERE COMP != 'Billed'
) Table1_B ON Table1_B.PRODUCT = Table1_A.PRODUCT 
    AND Table1_B.CUSTOMER = Table1_A.CUSTOMER

我想如果我输入一个UNION 并引用两个等于Billed 而不等于Billed,那么它将保持我正在寻找的格式,但它只是重复每个CUSTOMER每一个COMP

【问题讨论】:

  • 对不起,我添加了我试过的SQL,只是我输入值时出现拼写错误,我已经修复了一个“NORTHERN LIGHTS”
  • 这能回答你的问题吗? How to delete duplicate rows in SQL Server?
  • 不,我实际上看到确实也尝试过,但这似乎只适用于整行的每一列都相同的情况,对于我的问题,每个重复行的两列是相同的,第三个是不同的,这是我要删除的依赖值
  • 只需更改查询以适合您的用例 - 它的原理完全相同。 row_number 方法是我建议的方式。
  • 我不想从原始表中删除它,尽管我只想要一个查询来显示我上面的结果表

标签: sql sql-server database tsql


【解决方案1】:

您可以对规则使用聚合:

SELECT PRODUCT, CUSTOMER, 
       (CASE WHEN COUNT(*) = 1 THEN MAX(COMP) ELSE 'Billed' END)
FROM table1 
GROUP BY PRODUCT, CUSTOMER;

您也可以使用UNION ALL 方法:

select product, customer, comp
from table1 t1
where comp = 'Billed'
union all
select product, customer, comp
from table1 t1
where not exists (select 1
                  from table1 tt1
                  where tt1.product = t1.product and
                        tt1.customer = t1.customer and
                        tt1.comp = 'Billed'
                 );

【讨论】:

  • 哇,谢谢这工作得很好,我有点困惑为什么你在 VARCHAR 字段上使用 MAX,这是否意味着它从字母顺序中取最低值?而且在这种情况下,由于它相同,所以无论哪个都没有关系,我们只是使用它来选择一个?
  • @Emitsu 。 . .基本上。从技术上讲,它是基于 collat​​ion 的最小值,但这通常是按字母顺序排列的,大写字母在小写字母之前排序。
猜你喜欢
  • 2017-12-17
  • 2023-01-19
  • 2018-05-27
  • 1970-01-01
  • 2017-07-28
  • 2016-07-11
  • 2021-12-02
  • 2018-12-01
  • 2021-07-03
相关资源
最近更新 更多