【发布时间】:2019-09-26 05:58:47
【问题描述】:
DataTable 表的结构如下:每一列的数据类型都是 int,RowID 是一个标识列和主键。 LinkID 是一个外键,链接到另一个表的行。
RowID LinkID Order Data DataSpecifier
1 120 1 1 1
2 120 2 1 3
3 120 3 1 10
4 120 4 1 13
5 120 5 1 10
6 120 6 1 13
7 371 1 6 2
8 371 2 3 5
9 371 3 8 1
10 371 4 10 1
11 371 5 7 2
12 371 6 3 3
13 371 7 7 2
14 371 8 17 4
.................................
.................................
我正在尝试通过以下方式更改每个 LinkID 批次的查询:
- 使用相同的
LinkID获取每一行(例如,第一批是这里的前 6 行) - 按
Order列排序 - 将
Data和DataSpecifier列视为一个比较单元(可以将它们视为一列,称为dataunit):- 从
Order1 开始保留尽可能多的行,直到出现重复的dataunit - 从
LinkID的第一个副本开始删除每一行
- 从
所以对于LinkID 120:
- 对批次进行排序(此处已排序,但仍应这样做)
- 从顶部开始查看(此处为
Order=1),只要您没有看到重复项即可。 - 在第一个重复的
Order = 5处停止(dataunit1 10已被看到)。 - 删除所有具有
LinkID=120 AND Order>=5的内容
在对LinkID371(以及表中的所有其他LinkID)进行类似处理后,处理后的表将如下所示:
RowID LinkID Order Data DataSpecifier
1 120 1 1 1
2 120 2 1 3
3 120 3 1 10
4 120 4 1 13
7 371 1 6 2
8 371 2 3 5
9 371 3 8 1
10 371 4 10 1
11 371 5 7 2
12 371 6 3 3
.................................
.................................
我已经完成了很多 SQL 查询,但从来没有这么复杂的事情。我知道我需要使用类似这样的查询:
DELETE FROM DataTable
WHERE RowID IN (SELECT RowID
FROM DataTable
WHERE -- ?
GROUP BY LinkID
HAVING COUNT(*) > 1 -- ?
ORDER BY [Order]);
但我似乎无法解决这个问题并正确查询。我最好在纯 SQL 中执行此操作,使用一个可执行(和可重用)查询。
【问题讨论】:
-
所以将
ROW_NUMBER更改为COUNT@ruohola。然后,不是删除重复项,而是删除计数大于 1 的所有内容。理论是相同的。 -
ROW_NUMBER() OVER (PARTITION BY...->COUNT({non NULL column}) OVER (PARTITION BY....
标签: sql sql-server tsql duplicates sql-delete