【问题标题】:Too many records dumped into SQL Server 2016 database太多记录转储到 SQL Server 2016 数据库中
【发布时间】:2021-05-18 20:01:44
【问题描述】:

另一位程序员试图修复我们的 Powershell 脚本,结果在与一台机器关联的一个表中出现了几百万条额外记录。大多数记录似乎按日期分组并重复。我能够使用“Group by”表达式找到其中的大多数,但无法使用 Update mytable set PartEval = 'Dup1' where ..... etc 来标记它们。

下面的按代码分组有效,并给了我那些重复的。大多数不属于的都被 DateRan 列复制

 SELECT DateRan, PartEval, count(*) as cntBad
 FROM MyTable
 WHERE MachineNr = @MachineNr 
   AND (DateRan >= some_date 
   AND DateRan <= Some_Date_Plus2)
 GROUP BY DateRan, PartEval
 HAVING COUNT(*) > 1;

 UPDATE mytable
 WHERE EXISTS (SELECT DateRan, PartEval, COUNT(*) AS cntBad
               FROM MyTable
               WHERE MachineNr = @MachineNr 
                 AND (DateRan >= some_date 
                 AND DateRan <= Some_Date_Plus2)
               GROUP BY DateRan, PartEval
               HAVING COUNT(*) > 1)

我尝试了上面的代码和WITH CTE 表达式,还尝试更新 my_table Where Exists(上面的代码)。但它只将 Dup1 设置为设置了日期范围的每条记录,而不仅仅是 Group By 表达式找到的那些记录。

关于如何查找和标记具有重复 dateran(日期时间列)的这些内容有什么建议吗?

【问题讨论】:

    标签: sql-server-2016


    【解决方案1】:

    处理重复项是您通常使用row_number 执行的操作。

    您为每组重复项分配一个行号,指定排序以确定您是要保留最低/最早还是最高/最新行。

    这可能会做你想做的事

    with d as (
        select dateran, parteval,
          Row_Number() over (partition by dateran, parteval order by dateran) as dupenum
        from MyTable
        where MachineNr = @MachineNr 
        and DateRan >= some_date and DateRan < Some_Date_Plus2
    )
    
    update d set parteval=Concat('Dup',dupenum-1)
    where dupenum>1
    

    如果您应该按两列或仅按 dateran 列分区,我不确定没有看到任何示例数据,毫无疑问,您可以弄清楚那部分。

    当然你可以删除重复的行

    delete from d
    where dupenum>1
    

    【讨论】:

    • 非常感谢。那成功了。我想暂时标记虚假数据,然后再删除。
    猜你喜欢
    • 1970-01-01
    • 2017-06-21
    • 2023-03-10
    • 2017-02-10
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多