【问题标题】:Duplicate Groups Based On Date基于日期的重复组
【发布时间】:2014-02-28 08:02:49
【问题描述】:

我有以下查询,它根据 RegNumber 列值检测重复项,如果不同的行输入日期相差不到 10 分钟,则查询保留具有最高 Confidence 列值的那个。

SELECT *, 
       CASE 
         WHEN conf_max = confidence THEN 'Conf_Max' 
         ELSE 'Duplicate' 
       END AS Is_Conf_Max 
FROM   (SELECT *, 
               Max(confidence) 
                 OVER ( 
                   partition BY regnumber) AS Conf_Max 
        FROM   (SELECT id, 
                       cameraid, 
                       dateseen, 
                       nationality, 
                       regnumber, 
                       confidence, 
                       Min(dateseen) 
                         OVER ( 
                           partition BY regnumber) AS DateSeen_Min, 
                       Max(dateseen) 
                         OVER ( 
                           partition BY regnumber) AS DateSeen_Max 
                FROM   plate_read 
                WHERE  ( cameraid IN ( 5, 6 ) )) A 
        WHERE  Abs(Datediff(minute, dateseen_max, dateseen_min)) <= 10) B 
WHERE  conf_max <> confidence 
ORDER  BY regnumber 

但是问题如下:这为我提供了 DateSeen 列相差不到 10 分钟的所有重复项。但是,如果我有另一组相隔超过 10 分钟且具有相同 RegNumber 的重复项,则不会检测到这些重复项,示例如下:

ID    CamId     DateSeen                 Nationality   Reg      Conf
--    -----     -------                 ----------     ---      ---
80      5    20/12/2013 12:10:57           E         5897HHS     94
81      5    20/12/2013 12:15:03           E         5897HHS     93
82      5    20/12/2013 12:16:17          GBZ        G6746D      98
83      5    20/12/2013 12:35:57           E         5897HHS     88
84      5    20/12/2013 12:36:03           E         5897HHS     86

从上面的数据中,只有 ID 80、82 和 83 是有效的,因为 81 是 80 的副本,84 是 83 的副本。希望有人能提供帮助吗?

【问题讨论】:

  • 抱歉,新成员不知道该怎么做……正在尝试。
  • 感谢米海。希望现在有人可以帮助我解决我的问题。
  • 那么为什么不修改分钟以选择更大的范围?
  • 因为如果相隔超过 10 分钟,则不再是重复条目,而是另一个有效条目。
  • 您可以有两个可能相隔 6 分钟且注册号相同的条目,这会创建 1 个重复项。半小时后,如果看到相同的注册号,它是有效的,但又一次,可能存在更多重复等。

标签: asp.net sql sql-server sql-server-2008 tsql


【解决方案1】:

这可能不是一个完整的答案,但为什么您的查询需要如此复杂?为什么不将其简化为(为清楚起见省略了额外的标准):

select *
from plate_read pr1
where conf = (
  select max (conf)
  from plate_read pr2
  where pr1.reg = pr2.reg
  and abs(datediff(minute,pr1.dateseen,pr2.dateseen)) < 11
  )

已保存in SQLfiddle here

【讨论】:

    猜你喜欢
    • 2020-02-24
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 2018-09-20
    相关资源
    最近更新 更多