SQL - получить все строки в одной таблице, созданные с разницей во времени в 1 минуту - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть таблица как:

   Id  Ticket_NUM        Date                          Comments
   ==  ==========        ========================      =======
   1       2             2014-08-29 08:44:34.122       a
   2       5             2014-08-29 08:44:34.125       b
   3       3             2014-08-29 08:44:34.137       a
   4       4             2016-08-29 08:44:34.137       b

Теперь я хотел бы получить Ticket_NUM, созданный в одно и то же время (2014-08-29 08: 44: 34.122) с максимальной разницей во времени<60 секунд.Может кто-нибудь сообщить мне, как мы можем написать запрос, чтобы получить эти данные.Я использовал self join на столе, но я не получаю Ticket_NUM (2, 5, 3), который я ищу. </p>

1 Ответ

0 голосов
/ 05 декабря 2018

Один способ будет с LEAD и LAG

select * from(
    select 
       *, 
        myFlag = case 
                    when abs(datediff(second,[date],lag([Date]) over (order by [Date]))) < 60 then 1
                    when abs(datediff(second,[date],lead([Date]) over (order by [Date]))) < 60 then 1
                    else 0
                 end
    from yourtable)
where myFlag = 1
order by [Date]

. Вы можете удалить where myFlag = 1, чтобы увидеть, какие из них помечены.

Или более уродливый метод:

with cte as(
select *, RN = row_number() over (order by [Date])
from yourtable
),

staging as(
    select 
        c.ID
        ,c.Ticket_NUM
        ,c.[Date]
        ,c.Comments
        ,c2DT = min(c2.[Date])
        ,c3DT = max(c3.[Date])
    from 
        cte c
        left join cte c2 on c2.RN = c.RN + 1  --row above
        left join cte c3 on c3.RN = c.RN - 1  --row below
    group by
        c.ID
        ,c.Ticket_NUM
        ,c.[Date]
        ,c.Comments)

select 
    c.ID
    ,c.Ticket_NUM
    ,c.[Date]
    ,c.Comments
from stating c
where abs(datediff(second,c.[Date],c.c2DT)) < 60 or abs(datediff(second,c.[Date],c.c3DT)) < 60
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...