2015-08-24 46 views
0

我有一个T-SQL函数可以在最近60分钟内将所有插入到主表中的记录插入到表变量中。然后我有更多的代码将过滤器设置为另一个表变量来返回。T-SQL - 删除除最近期间以外的所有重复项(SQL Server 2005)

在这个集合中,我期待一些记录有多个事件,但他们将有一个独特的日期时间。 我想删除每个大于或等于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; 
+0

示例数据和预期输出将会很有帮助。 'r_count> = 3'不会删除所有重复项。实际上这个查询仍然会导致重复记录 –

+0

你是什么意思删除每个记录,但保留一个?你是否想要删除除最近一行以外的所有行,对于发生3次以上的行?这是不是很清楚你在这里做什么。 –

回答

1

我认为你必须使用PARTITION BY ColA, ColB, ColC ORDER BY DateTimeColumn DESC,而不是解决了,那么你就可以删除所有,但一个(最近):

WITH cte AS 
(
     SELECT ColA, ColB, DateTimeColumn, ColC, 
      ROW_NUMBER() OVER (PARTITION BY ColA, ColB, ColC ORDER BY DateTimeColumn DESC) AS r_count 
     FROM @table_variable_2 
) 
DELETE 
FROM  cte 
WHERE  r_count > 1 
0
WITH cte AS (SELECT ColA, ColB, DateTimeColumn, ColC, 
ROW_NUMBER() OVER (PARTITION BY ColA, ColB, DateTimeColumn,ColC 
ORDER BY ColA, DateTimeColumn desc) AS r_count 
FROM @table_variable_2) 
, cte1 as (select * from cte where r_count >= 3) 
DELETE FROM cte1 
WHERE r_count <> 1 

您可以再做一个cte以选择所有带有r_count>=3的记录。然后删除以保留最新记录。

相关问题