【发布时间】:2015-11-18 02:29:18
【问题描述】:
我有一个 T-SQL 函数,它将在过去 60 分钟内提取所有插入主表的记录并将它们插入到表变量中。然后我得到了一些代码,这些代码将把该集合过滤到另一个要返回的表变量中。
在这个集合中,我预计一些记录会出现多次,但它们会有一个唯一的日期时间。 我想删除每条出现次数大于或等于 3 次的记录,但保留最近日期时间值的记录。
编辑:对不起,我认为我比看起来更清楚。
此数据是来自旧系统的错误日志数据,因此可能会出现重复。这个想法是,如果他们超过某个阈值,就需要报告。
例如,下面的内容应该以@table_variable_2 结尾:
| ColA | ColB | DateTimeColumn | ColC |
---------------------------------------------------
1 | A | B | 2015-08-24 11:06:14.000 | C |
2 | A | B | 2015-08-24 11:18:58.000 | C |
3 | A | B | 2015-08-24 12:07:45.000 | C |
4 | A2 | B2 | 2015-08-24 12:17:24.000 | C2 |
5 | A2 | B2 | 2015-08-24 13:25:32.000 | C2 |
6 | A3 | B3 | 2015-08-24 14:52:10.000 | C3 |
7 | A3 | B3 | 2015-08-24 14:52:34.000 | C3 |
8 | A3 | B3 | 2015-08-24 14:52:45.000 | C3 |
9 | A3 | B3 | 2015-08-24 14:53:15.000 | C3 |
10 | A3 | B3 | 2015-08-24 14:53:32.000 | C3 |
这是我期望得到的回报:
| ColA | ColB | DateTimeColumn | ColC |
---------------------------------------------------
1 | A | B | 2015-08-24 12:07:45.000 | C |
2 | A2 | B2 | 2015-08-24 12:09:35.000 | C2 |
3 | A2 | B2 | 2015-08-24 13:25:32.000 | C2 |
4 | A3 | A3 | 2015-08-24 14:53:32.000 | C3 |
有一些重复没关系,只是有很多重复的机会。
编辑 2:在没有 CTE 函数的情况下解决
DELETE @rtrn_tbl FROM @rtrn_tbl
AS a
INNER JOIN
(
SELECT ColA, ColB, MAX(DateTimeColumn) AS MaxDate, ColC FROM @rtrn_tbl
GROUP BY ColA, ColB, ColC
HAVING COUNT(*) > 2
) AS b
ON a.ColA = b.ColA AND a.ColB=a.ColB and a.ColC = b.ColC
WHERE a.DateTimeColumn <> b.MaxDate;
【问题讨论】:
-
样本数据和预期输出会有所帮助。
r_count >= 3不会删除所有重复项。事实上,这个查询仍然会导致重复 -
删除每条记录但保留一条是什么意思???您是说要删除出现次数超过 3 次的行的所有行,但最近的行除外?您在这里尝试做什么不是很清楚。
标签: sql sql-server tsql sql-server-2005