我有一个表,其中有多个使用相同日期的条目,并且我想删除其中的一个或多个。删除将基于第二个表中的值。这是一个例子。
表1:
Row Customer Task Frequency Date mm/dd/yy
1 A X 1 07/01/19
2 A X 1 08/01/19
3 A X 1 09/01/19
4 A Y 3 09/01/19
5 A X 1 10/01/19
6 A W 1 10/01/19
7 A X 1 11/01/19
8 A X 1 12/01/19
9 A Y 3 12/01/19
10 A Z 12 12/01/19
此影响数据来自表2,按任务链接:
Task Group Frequency Priority
X A 1 1
Y A 3 2
Z A 12 3
W B 10 1
任务是删除表1中的行,其中所有行都使用同一位客户,在同一日期,在表2中属于同一组并且在表2中具有较低的优先级。因此,在上述示例中,表1中的以下行将被删除:
3它属于同一组,与第4行在同一日期,但优先级较低
8&9它们属于同一组,并且与第12行的日期相同,但是优先级较低
第6行不会被删除,因为它具有相同的日期等,但属于不同的组。
表1现在看起来像这样(行号纯粹是为了帮助理解问题):
Row Customer Task Frequency Date mm/dd/yy
1 A X 1 07/01/19
2 A X 1 08/01/19
3 A Y 3 09/01/19
4 A X 1 10/01/19
5 A W 1 10/01/19
6 A X 1 11/01/19
7 A Z 12 12/01/19
答案 0 :(得分:0)
请尝试使用以下脚本(请进行测试(因为我现在无法访问任何SQL Server来验证任何语法错误)-
;WITH CTE AS (
SELECT
RowIndexing = (ROW_NUMBER() OVER (PARTITION BY T1.Customer, T1.Date, T2.Group ORDER BY T2.Priority DESC)),
T1.Row
FROM Table1 T1
INNER JOIN Table2 T2 ON T2.Task = T1.Task
)
--DELETE T1
SELECT T1.*
FROM Table1 T1
INNER JOIN CTE ON CTE.Row = T1.Row
WHERE CTE.RowIndexing > 1
在下面添加新的解决方案(假设表中不存在Row
列)-
;WITH CTE AS (
SELECT
RowIndexing = (ROW_NUMBER() OVER (PARTITION BY T1.Customer, T1.Date, T2.Group ORDER BY T2.Priority DESC)),
T1.Customer,
T1.Task,
T1.Frequency,
T1.Date
FROM Table1 T1
INNER JOIN Table2 T2 ON T2.Task = T1.Task
)
--DELETE T1
SELECT T1.*
FROM Table1 T1
INNER JOIN CTE ON CTE.Customer = T1.Customer AND CTE.Task = T1.Task AND CTE.Frequency = T1.Frequency AND T1.Date = CTE.Date
WHERE CTE.RowIndexing > 1
以上解决方案将返回行,如果您取消注释delete
行并在其下方注释掉select
行,则会删除这些行。