【问题标题】:how to return duplicate rows if date difference is equal or more than 4 days or 96 hours如果日期差等于或大于 4 天或 96 小时,如何返回重复行
【发布时间】:2016-08-04 07:43:23
【问题描述】:

我必须获取重复记录 如果重复记录之间的日期差异超过 96 小时或 4 天,否则忽略重复条目并返回第一个条目或最早日期的记录。我的桌子是这样的:

ID           SDATE
----------- -----------------------
1           2016-04-13 14:54:18.983
1           2016-04-08 12:55:47.907
2           2016-04-13 14:54:18.983
3           2016-04-13 14:54:18.983
4           2016-04-13 14:54:18.983
5           2016-04-13 14:54:18.983
5           2016-04-11 12:55:47.907
6           2016-04-13 14:54:18.983
6           2016-04-13 14:54:18.983

预期结果:

ID           SDATE
----------- -----------------------
1           2016-04-13 14:54:18.983
1           2016-04-08 12:55:47.907
2           2016-04-13 14:54:18.983
3           2016-04-13 14:54:18.983
4           2016-04-13 14:54:18.983    
5           2016-04-11 12:55:47.907
6           2016-04-13 14:54:18.983  

我尝试了以下查询,但它不起作用。

WITH tt AS (
SELECT 1 as ID, GETDATE() as SDATE
UNION ALL
SELECT 1 as ID, '2016-04-09 12:55:47.907' as SDATE
UNION ALL
SELECT 2 as ID, GETDATE() as SDATE
UNION ALL
SELECT 3 as ID, GETDATE() as SDATE
UNION ALL
SELECT 4 as ID, GETDATE() as SDATE
UNION ALL
SELECT 5 as ID, GETDATE() as SDATE
UNION ALL
SELECT 5 as ID, '2016-04-11 12:55:47.907' as SDATE
UNION ALL
SELECT 6 as ID, GETDATE() as SDATE
UNION ALL
SELECT 6 as ID, GETDATE() as SDATE
)
SELECT MIN(SDATE) as SDATE, ID FROM tt as tbl
GROUP BY ID,  DATEADD(HH, DATEDIFF(HH,0,SDATE) + 96,0) 

【问题讨论】:

  • 如果一个id有以下3条记录怎么办? {'2016-04-01 06:00:00.000', '2016-04-03 18:00:00.000', '2016-04-06 06:00:00.000'}?每条记录相隔不到 4 天,但第一条和最后一条记录相隔 5 天。
  • 如果有 3 个重复 ID,第一个日期 - 1/4/2016 ,第二个日期 - 3/4/2016 和第三个日期 6/4/2016 会发生什么情况第二个的副本。应该删除哪个?
  • @MatBailie Hah,同样的问题,同样的日期。
  • 嗨@MatBailie,如果有超过 2 条记录而不是我们查看的第一个和最后一个日期。

标签: sql sql-server sql-server-2008 tsql group-by


【解决方案1】:

以下查询返回预期结果,添加了内联 cmets:

-- Simply grouping each ID and get unique row with minimum date
SELECT MIN(SDATE) [SDate], ID
FROM tt
GROUP BY ID

UNION 

-- Get the row with each ID's difference is more than 96 hours
SELECT D.MaxDate  [SDate], D.ID
FROM (
    SELECT MIN(SDATE) [MinDate], MAX(SDATE) [MaxDate], ID
    FROM tt
    GROUP BY ID
) D
WHERE DATEDIFF(HH, D.MinDate, D.MaxDate) >= 96

【讨论】:

  • 我不相信。如果你有1st, 4th, 7th, 10th, 13th 的日期呢?这个答案将返回1st, 7th, 10th, 13th,即使最后三个结果都只有 3 天的差距。这并不是说这是错误的,只是 OP 对这种情况的要求还很不清楚。
【解决方案2】:

请尝试以下查询,我已经测试它工作正常。

在忽略列中,您可以更改时间段(HH 或 DAY)

-- drop table #temptbl

WITH tt AS (
SELECT 1 as ID, GETDATE() as SDATE
UNION ALL
SELECT 1 as ID, '2016-04-09 12:55:47.907' as SDATE
UNION ALL
SELECT 2 as ID, GETDATE() as SDATE
UNION ALL
SELECT 3 as ID, GETDATE() as SDATE
UNION ALL
SELECT 4 as ID, GETDATE() as SDATE
UNION ALL
SELECT 5 as ID, GETDATE() as SDATE
UNION ALL
SELECT 5 as ID, '2016-04-11 12:55:47.907' as SDATE
UNION ALL
SELECT 6 as ID, GETDATE() as SDATE
UNION ALL
SELECT 6 as ID, GETDATE() as SDATE
)
SELECT Id,SDATE,case when DATEDIFF(HH,SDATE,GETDATE()) >94 THEN 0 else 1 end AS ignore,
  ROW_NUMBER() OVER ( PARTITION BY tt.ID ORDER BY tt.SDATE desc ) as Rowid
INTO #temptbl
FROM tt 
SELECT Id, sdate   from #temptbl
WHERE (#temptbl.ignore = 0) or (#temptbl.Rowid = 1)

【讨论】:

    【解决方案3】:
    declare @table table
    (
    ID int,           SDATE datetime)
    insert into @table
    (
    ID      ,SDATE )
    values 
    (1,'2016-04-13 14:54:18'),
    (1,'2016-04-08 12:55:47'),
    (2,'2016-04-13 14:54:18'),
    (3,'2016-04-13 14:54:18'),
    (4,'2016-04-13 14:54:18'),
    (5,'2016-04-13 14:54:18'),
    (5,'2016-04-11 12:55:47'),
    (6,'2016-04-13 14:54:18'),
    (6,'2016-04-13 14:54:18')
    
    
    ;with cte as
    (
    select  id,min(sdate) mindate,max(sdate) maxdate, datediff(dd,min(sdate),max(sdate)) daysdiff,count(*) as Dups
     from @table
     group by   id 
     )
    select  cte.id, t.sdate
    from cte
    join    @table t on t.id = cte.id 
    where   cte.dups > 1 and cte.daysdiff > 4
    union all
    select  cte.id, 
            mindate
    from cte
    where   (cte.dups > 1 and cte.daysdiff <= 4) or
            cte.dups = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 2014-12-26
      • 2016-09-25
      • 2018-08-05
      • 2023-03-29
      • 2011-07-08
      • 2012-07-30
      相关资源
      最近更新 更多