Select non duplicate values from rows that are less than a specified number of minutes apart

感情迁移 提交于 2020-01-25 06:25:29

问题


I have a huge table with the following format:

DATETIME                   NUMBER
--------------------------------------
2009-03-31 16:05:52.000    2453651622
2009-03-31 16:16:12.000    30206080
2009-03-31 16:16:16.000    16890039
2009-03-31 16:16:28.000    2452039696
2009-03-31 16:16:33.000    140851934
2009-03-31 16:16:51.000    2453120306
2009-03-31 16:16:57.000    2453120306
...
2009-04-01 21:15:24.000    2453651622

How can I select the rows that don't have duplicate numbers in the second column if they occur less than 15 minutes apart?

In the previous example, the second row with number 2453120306 is a duplicate because it is less than 15 minutes apart from the previous one, and should not be selected.

The last row has the same number as the first row, but it is not a duplicate because it occurs more that 24 hours later.


回答1:


-- distinct required in case there are rows with 
-- exactly the same values for datetime and number
SELECT DISTINCT a.*
FROM your_table AS a
    LEFT JOIN your_table AS b
        ON a.[number] = b.[number]
            AND a.[datetime] > b.[datetime]
            AND a.[datetime] <= DATEADD(minute, 15, b.[datetime])
WHERE b.Number IS NULL



回答2:


try this:

Select * From Table t
Where Not Exists
   (Select * From Table
    Where DateTime Between DateAdd(second, -450,  t.DateTime)
                       And DateAdd(second,  450,  t.DateTime)
        -- next row is better to exclude same row using a PK if available
        And DateTime <> t.DateTime 
        And Number = t.Number) 

Also edited to use sliding 15 minute based on your answer above.



来源:https://stackoverflow.com/questions/3993008/select-non-duplicate-values-from-rows-that-are-less-than-a-specified-number-of-m

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!