【问题标题】:T-SQL - Remove All Duplicates Except Most Recent (SQL Server 2005)T-SQL - 删除除最近之外的所有重复项 (SQL Server 2005)
【发布时间】: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 &gt;= 3 不会删除所有重复项。事实上,这个查询仍然会导致重复
  • 删除每条记录但保留一条是什么意思???您是说要删除出现次数超过 3 次的行的所有行,但最近的行除外?您在这里尝试做什么不是很清楚。

标签: sql sql-server tsql sql-server-2005


【解决方案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

【讨论】:

    【解决方案2】:
    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&gt;=3 的记录。然后删除以保留最新记录。

    【讨论】:

      猜你喜欢
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      相关资源
      最近更新 更多