从SQL表中删除重复的行(基于多个列中的值)

维克拉姆

我有以下SQL表:

AR_Customer_ShipTo

+--------------+------------+-------------------+------------+
| ARDivisionNo | CustomerNo |   CustomerName    | ShipToCode |
+--------------+------------+-------------------+------------+
|           00 | 1234567    | Test Customer     |          1 |
|           00 | 1234567    | Test Customer     |          2 |
|           00 | 1234567    | Test Customer     |          3 |
|           00 | ARACODE    | ARACODE Customer  |          1 |
|           00 | ARACODE    | ARACODE Customer  |          2 |
|           01 | CBE1EX     | Normal Customer   |          1 |
|           02 | ZOCDOC     | Normal Customer-2 |          1 |
+--------------+------------+-------------------+------------+

(ARDivisionNo, CustomerNo,ShipToCode) 构成该表的主键。

如果您发现前3行属于同一客户(测试客户),他们具有不同的ShipToCode:1、2和3。第二个客户(ARACODE客户)也是如此。普通客户和普通客户2都只有1条记录,且只有一个记录ShipToCode

现在,我想在此表上查询结果,每个客户只有1条记录。因此,对于记录多于1条的任何客户,我想保留最高价值的记录ShipToCode

我尝试了各种方法:

(1)我可以很容易地获得客户列表,而表中只有一条记录。

(2)通过以下查询,我可以获取表中有多个记录的所有客户的列表。

[查询1]

SELECT ARDivisionNo, CustomerNo
FROM AR_Customer_ShipTo 
GROUP BY ARDivisionNo, CustomerNo
HAVING COUNT(*) > 1;

(3)现在,为了为ShipToCode上述查询返回的每条记录选择合适的内容,我不知道如何遍历上述查询返回的所有记录。

如果我做类似的事情:

[查询2]

SELECT TOP 1 ARDivisionNo, CustomerNo, CustomerName, ShipToCode  
FROM AR_Customer_ShipTo 
WHERE ARDivisionNo = '00' and CustomerNo = '1234567'
ORDER BY ShipToCode DESC

然后,我可以获得(00-1234567-Test Customer)的适当记录。因此,如果我可以在上述查询(查询2)中使用查询1的所有结果,那么我可以为具有多个记录的客户获得所需的单个记录。可以将其与点(1)的结果相结合,以获得所需的最终结果。

同样,这比我遵循的方法容易。请让我知道我该怎么做。

[注意:我只能使用SQL查询来执行此操作。我无法使用存储过程,因为我将最终使用“ Scribe Insight”执行该操作,该操作仅允许我编写查询。]

HaveNoDisplayName

Sample SQL FIDDLE

1)使用CTE根据每个客户的ARDivisionNo,CustomerNo获取最大船代号价值记录

WITH cte AS (
  SELECT*, 
     row_number() OVER(PARTITION BY ARDivisionNo, CustomerNo ORDER BY ShipToCode desc) AS [rn]
  FROM t
)
Select * from cte WHERE [rn] = 1

2)要删除记录,请使用“删除”查询,而不是“选择”并将“子句”更改为rn> 1。 Sample SQL FIDDLE

WITH cte AS (
  SELECT*, 
     row_number() OVER(PARTITION BY ARDivisionNo, CustomerNo ORDER BY ShipToCode desc) AS [rn]
  FROM t
)
Delete from cte WHERE [rn] > 1;

select * from t;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从SQL Server删除重复的行(基于多个列中的值)

基于多个列值删除表中的重复项

基于Julia中列的重复值删除矩阵行

在SQL中,如何删除基于多列的重复行?

如何从表中删除重复的行但保留列值的总和

删除多个 Postgresql 表中的重复行

如何基于单列中的重复值删除工作表中的行

从基于多列检查的表中删除重复行并且表大小保持不变

从基于文件的列和行中的最大值中删除重复项 -pandas

如何删除基于多个列的重复值

通过使用熊猫中几乎相等的条件基于列值删除重复的行

SQL Server 2008 R2:从多个表中删除重复的行,并保留原始的行

如何删除基于列值的重复行?

基于多个条件的列中的值到行中的值

如何通过排除基于SQL中的列值从多个行中获取所需的行

基于一列删除左连接中的重复行

如何基于另一个表的多个列中的值从表中提取多个行,然后在SQL中进行串联?

删除基于第一列的表中的重复条目(该表由冒号分隔的两个值组成)

如何从 SQL 表中获取行而忽略在特定列中具有重复值的行

Excel宏,读取工作表,删除列中没有基于值的数据的行

如何基于Python中的列值重复行

如何使用Transact SQL合并多个列中的值并删除任何重复项

删除 R 中数据帧列中的重复值而不删除与重复值关联的行

从Microsoft SQL Server 2012表中删除部分重复的行(仅两列中的重复数据)

删除列中的重复值

在列中删除重复的值

如何从SQL内部联接表中删除重复的值?

在MySQL中基于重复列删除行

MSSQL:如何从不同的表中删除重复的列值?