【问题标题】:SQL Select Duplicate records by dateSQL按日期选择重复记录
【发布时间】:2020-08-27 07:48:14
【问题描述】:

我有这个:

SELECT        ActionDateTime, [Action Location], FirstName, MiddleName, LastName, 
              IDNumber, IDNumber2, IDNumber3, Department, CardData_BadgePass, Location, Birthdate
FROM          dbo.EmployeeEntityTracking AS t
WHERE EXISTS    (SELECT  CAST(ActionDateTime AS DATE) AS Expr1, [Action Location], FirstName, 
                         MiddleName, LastName, IDNumber, IDNumber2, IDNumber3, Department, CardData_BadgePass, Location, Birthdate
                 FROM            dbo.EmployeeEntityTracking AS x
                 WHERE        (IDNumber = t.IDNumber) AND (ActionDateTime <> t.ActionDateTime))

返回有重复的记录,但我需要按日期过滤。 (查询返回重复但所有日期。我需要在每个日期重复。

【问题讨论】:

  • 帮助我们帮助您 - 请分享一些示例数据以及您尝试为此示例获得的结果
  • @EricRoss 首先,很高兴阅读Tour Page 以了解有关此站点的更多信息并获得您的第一个知情徽章。其次,请添加您获得的当前输出和您想要的预期输出,因为我认为您的要求并不明确
  • 你尝试过不同的吗?

标签: sql sql-server datetime filter duplicates


【解决方案1】:

尝试使用 group by:

SELECT CAST(ActionDateTime AS DATE)
    ,[Action Location]
    ,FirstName
    ,MiddleName
    ,LastName
    ,IDNumber
    ,IDNumber2
    ,IDNumber3
    ,Department
    ,CardData_BadgePass
    ,Location
    ,Birthdate
FROM dbo.EmployeeEntityTracking AS t
GROUP BY
 CAST(ActionDateTime AS DATE)
,[Action Location]
,FirstName
,MiddleName
,LastName
,IDNumber
,IDNumber2
,IDNumber3
,Department
,CardData_BadgePass
,Location
,Birthdate
HAVING COUNT(IDNumber) > 1 

PS:它将仅显示所有列的重复项,如果您只想按 ID 和日期显示,请尝试排除所有项目。

【讨论】:

    【解决方案2】:

    首先不必列出exists子句中的所有列,只需将它们替换为任何固定值,因为您正在寻找行的存在而不是寻找返回列值

    由于问题不是很清楚,我根据您可能要求的案例提供了许多建议:

    1) 如果您希望获得基于 IDNUMBERActionDateTime 的重复项

    选择 * 从 (

    SELECT      DISTINCT  ActionDateTime, [Action Location], FirstName, MiddleName, LastName, 
                  IDNumber, IDNumber2, IDNumber3, Department, CardData_BadgePass, Location, Birthdate
                  ,COUNT(ActionDateTime) OVER(PARTITION BY ActionDateTime,IDNUMBER) AS [ItemCount]
    FROM          dbo.EmployeeEntityTracking AS t
    WHERE EXISTS    (SELECT         1
                     FROM            dbo.EmployeeEntityTracking AS x
                     WHERE        (x.IDNumber = t.IDNumber) AND (x.ActionDateTime <> t.ActionDateTime))) AS T1
    WHERE T1.ItemCount > 1
    ORDER BY T1.ActionDateTime
    

    2) 如果我了解您要查找的内容,您可以使用DISTINCT 函数根据所有列消除重复项

    SELECT      DISTINCT  ActionDateTime, [Action Location], FirstName, MiddleName, LastName, 
                  IDNumber, IDNumber2, IDNumber3, Department, CardData_BadgePass, Location, Birthdate
    FROM          dbo.EmployeeEntityTracking AS t
    WHERE EXISTS    (SELECT         1
                     FROM            dbo.EmployeeEntityTracking AS x
                     WHERE        (x.IDNumber = t.IDNumber) AND (x.ActionDateTime <> t.ActionDateTime))
    

    3) 如果您正在寻找具有相同重复日期的行

    SELECT * FROM (
    
        SELECT      DISTINCT  ActionDateTime, [Action Location], FirstName, MiddleName, LastName, 
                      IDNumber, IDNumber2, IDNumber3, Department, CardData_BadgePass, Location, Birthdate
                      ,COUNT(ActionDateTime) OVER(PARTITION BY ActionDateTime) AS [DateCount]
        FROM          dbo.EmployeeEntityTracking AS t
        WHERE EXISTS    (SELECT         1
                         FROM            dbo.EmployeeEntityTracking AS x
                         WHERE        (x.IDNumber = t.IDNumber) AND (x.ActionDateTime <> t.ActionDateTime))) AS T1
    WHERE T1.DateCount > 1
    ORDER BY T1.ActionDateTime
    

    4) 如果您希望消除所有包含相同日期的行:

    SELECT * FROM (
    
        SELECT      DISTINCT  ActionDateTime, [Action Location], FirstName, MiddleName, LastName, 
                      IDNumber, IDNumber2, IDNumber3, Department, CardData_BadgePass, Location, Birthdate
                      ,COUNT(ActionDateTime) OVER(PARTITION BY ActionDateTime) AS [DateCount]
        FROM          dbo.EmployeeEntityTracking AS t
        WHERE EXISTS    (SELECT         1
                         FROM            dbo.EmployeeEntityTracking AS x
                         WHERE        (x.IDNumber = t.IDNumber) AND (x.ActionDateTime <> t.ActionDateTime))) AS T1
    WHERE T1.DateCount < 2
    ORDER BY T1.ActionDateTime
    

    【讨论】:

      猜你喜欢
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多