【发布时间】:2019-08-12 03:03:20
【问题描述】:
我有下面的表格,我需要根据 PerCode 值成对删除两个日期之间的相反行, 实际上,我们删除了日期范围内具有相同 PerCode 并且具有相等和相反值的行。
问题是开始日期和结束日期是用户在报告时作为参数提供的,但是如果我尝试在运行时删除它们,查询会花费太多时间。
例子:
开始日期 = 01/01/2018 结束日期 = 2018 年 12 月 31 日
我应该删除第 3 行和第 4 行。 你知道如何在优化性能的同时做到这一点(表有 2 亿行)
+----+------------+---------+---------+-----------+
| Id | Date | PerCode | Value | IsDeleted |
+----+------------+---------+---------+-----------+
| 1 | 01/10/2017 | C1 | 10 | |
| 2 | 01/01/2018 | C1 | -10 | |
| 3 | 15/02/2018 | C2 | 20 | 1 |
| 4 | 10/03/2018 | C2 | -20 | 1 |
| 5 | 01/12/2018 | C3 | 15 | |
| 6 | 01/02/2019 | C3 | -15 | |
+----+------------+---------+---------------------+
【问题讨论】:
-
我不明白您为什么根据问题中的信息删除第 3 行和第 4 行。我可以看到第 3 行和第 4 行的值的总和为 -20 + 20 = 0。但该日期范围内还有其他行。第 2 行的值为 -10,第 5 行的值为 +15。其他行都在日期范围之外。日期范围内所有行的 SUM 实际上是 +5,所以我预计不会删除任何行。没有什么可以解释为什么第 3 行和第 4 行的处理方式不同。我可以看到它们具有相等和相反的值,但这没有作为标准的一部分提及。
-
@RichardHansell,谢谢你的回复我添加了 PerCode 列以便更清楚,行也应该根据 PerCode 值成对删除,所以我们删除日期范围内具有相同 PerCode 的行并且具有相等和相反的值
-
好的,这对你的问题有很大的影响!我的意思是从根本上改变了你的要求。这背后可能有很多问题,例如每个“percode”总是正好有两行吗?如果“percode”有三行,+10、-10、-10,你会随机删除+10和一-10,还是保留所有三行?当您说删除时,您的意思是“设置 IsDeleted 标志”?
-
是的,每个“percode”可以有超过 2 行,如果是这样,我会随机删除 +10 和一个 -10,正如你已经说过的。除此之外,删除意味着设置一个 IsDeleted 标志。我已经完成了完成这项工作的查询(查询更新了表上的 isDeleted 列),但我有义务在运行时(报告时间)应用查询,因为我不知道之前的开始日期和结束日期,并且这需要太多时间。
-
你能提供你已经使用的查询(那个不是高性能的)吗?
标签: tsql sql-server-2012 query-performance