【问题标题】:Delete duplicate rows where time difference < @Time删除时差<@Time的重复行
【发布时间】:2021-04-30 07:20:06
【问题描述】:

我需要从表中删除重复的行,其中行之间的时间差为

table : clockdates
+-----+------------+--------------+------------+
| ID  |    date    |     time     |   empnum   |
+-----+------------+--------------+------------+
|  1  | 2021/04/01 |   08:00:00   |    emp1    |
|  2  | 2021/04/01 |   08:01:00   |    emp1    |
|  3  | 2021/04/01 |   10:00:00   |    emp1    |
|  4  | 2021/04/01 |   16:30:00   |    emp1    |
|  5  | 2021/04/01 |   16:32:00   |    emp1    |
|  6  | 2021/04/01 |   17:00:00   |    emp2    |
|  7  | 2021/04/01 |   17:03:00   |    emp2    |
+-----+------------+--------------+------------+

预期结果:

table : clockdates
+-----+------------+--------------+------------+
| ID  |    date    |     time     |   empnum   |
+-----+------------+--------------+------------+
|  1  | 2021/04/01 |   08:00:00   |    emp1    |
|  3  | 2021/04/01 |   10:00:00   |    emp1    |
|  4  | 2021/04/01 |   16:30:00   |    emp1    |
|  6  | 2021/04/01 |   17:00:00   |    emp2    |
|  7  | 2021/04/01 |   17:03:00   |    emp2    |
+-----+------------+--------------+------------+

我尝试了以下代码,但它只会删除时间完全相同的行(10:00:00 和 10:00:00)。我不知道如何使用@DupTime。 (@DupTime 是分钟)

CREATE PROCEDURE [dbo].[DelDup]
    @fDate date
AS 
DECLARE @DupTime INT = (SELECT [DupTime] FROM [dbo].[ProgramOptions])
WITH CTE([empnum], 
    [date], 
    [time], 
    duplicatecount)
AS (SELECT [empnum], 
           [date], 
           [time], 
           ROW_NUMBER() OVER(PARTITION BY [empnum], 
                                          [date], 
                                          [time]
           ORDER BY ID) AS DuplicateCount
    FROM [dbo].[clockdates])
DELETE FROM CTE
WHERE ClockDate >= @fDate AND DuplicateCount > 1

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    如果我理解正确,使用lag就像下面一样简单!

    with d as (
        select Id, case when DateDiff(minute,Lag(time) over(partition by date, empnum order by id) , time)<=2 then 1 else 0 end del
        from clockdates
    )
    delete from d where del=1
    

    【讨论】:

    • 哇!这正是我所需要的,而且非常简单。谢谢你。我将不得不阅读有关 lag() 的一些信息。
    • @SupertimeDeveloper 太棒了! lag 和类似的 window fuctions 是在 2012 年推出的,让大量以前繁琐的操作变得简单。
    猜你喜欢
    • 1970-01-01
    • 2019-01-21
    • 2018-04-07
    • 1970-01-01
    • 2020-12-01
    • 2012-12-07
    相关资源
    最近更新 更多