【问题标题】:SQL - get all rows in one table created in a time difference of 1 minuteSQL - 获取在 1 分钟的时间差内创建的一个表中的所有行
【发布时间】:2019-05-07 10:01:48
【问题描述】:

我有一张桌子:

   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

现在,我想获取在同一日期时间(2014-08-29 08:44:34.122)创建的 Ticket_NUM,最大时差小于 60 秒。谁能让我知道我们如何编写查询来获取这些数据。我在桌子上使用了自加入,但没有得到我正在寻找的 Ticket_NUM(2, 5, 3)。

【问题讨论】:

  • 请分享您编写的未产生预期结果的查询。
  • 所以您想退回任何在 60 秒内创建的工单,无论它们是否是连续的?
  • 是的,一旦我获得了在该范围内创建的记录,我就可以根据 cmets 过滤记录
  • 如果它们是连续的,那也是积极的
  • 什么版本的sql server

标签: sql-server sql-server-2008 datetime join


【解决方案1】:

一种方法是使用LEADLAG

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

【讨论】:

  • 当然可以,从 2012 年开始:docs.microsoft.com/en-us/sql/t-sql/functions/…
  • 在该服务器上运行select @@version 会得到什么?我添加了一个潜在的替代方案。
  • 无论日期如何,在其前后 60 秒创建记录的所有行
  • 你从你的表中看到的地方使用你的表名
猜你喜欢
  • 2018-08-26
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
相关资源
最近更新 更多