【问题标题】:Filter rows by specific interval按特定间隔过滤行
【发布时间】:2014-10-05 03:32:33
【问题描述】:

我在表中有以下 DateTime 值,仅当此值之间的间隔 > 5 秒时才需要过滤集合。这应该是一个特定的日期,从第一行开始。

知道如何仅在使用 SQL Server 2012 的 SQL 中执行此操作吗?

1     2014-04-02 05:33:56.60
2     2014-04-02 05:40:01.55
3     2014-04-02 05:52:45.81
4     2014-04-02 05:52:47.50
5     2014-04-02 06:35:48.84
6     2014-04-02 06:50:49.72
7     2014-04-02 07:01:02.71
8     2014-04-02 07:01:04.35
9     2014-04-02 07:01:09.29
10    2014-04-02 07:44:05.71
11    2014-04-02 08:37:47.06

【问题讨论】:

  • 你的sql版本是多少?
  • 我使用的是 MS SQL 2012
  • 如果第一列中的数字密集(没有间隙),那么一个简单的自连接(伪代码)on a.id=b.id+1 and diff(a.timestamp,b.timestamp) > 5 sec。否则,您需要使用时间戳的相关子查询。
  • 我认为您也可以使用LAGLEAD 函数。 @JimGarrison 性能方面,为此目的使用分析函数是个好主意吗?
  • 不知道 MSSQL。我使用 Postgres。

标签: sql-server database tsql sql-server-2012


【解决方案1】:

在 SQL Server 2012 中你可以使用前导函数,试试下面

;with cte as
(
    select id, d,  datediff(s, d, lead(d) over(order by d)) as diff from Test
)
select * from cte where diff > 5

【讨论】:

    【解决方案2】:

    你可以这样使用它

    WITH    rows AS
        (
        SELECT  *, ROW_NUMBER() OVER (ORDER BY InputDate) AS rn
        FROM    given_table
        )
    SELECT  DATEDIFF(second, mc.InputDate, mp.InputDate)
    FROM    rows mc
    JOIN    rows mp
    ON      mc.rn = mp.rn - 1
    where DATEDIFF(second, mc.InputDate, mp.InputDate)> 5
    

    【讨论】:

      【解决方案3】:

      您可以使用前导函数获取下一个日期和 datediff 来计算秒差,然后根据您的条件进行过滤。

      with cte as
      (
          select id, date, diff = datediff(s, date, lead(date) over(order by date)
          from tbl
      )
      select * from cte where diff > 5
      

      【讨论】:

      • 使用您的代码我得到:关键字“选择”附近的语法不正确。请您仔细检查一下吗?
      【解决方案4】:

      希望这对你也有帮助。

      DECLARE @TAB TABLE (ID INT,DT DATETIME)
      INSERT INTO @TAB VALUES
      (1 ,'2014-04-02 05:33:56.60'),
      (2 ,'2014-04-02 05:40:01.55'),
      (3 ,'2014-04-02 05:52:45.81'),
      (4 ,'2014-04-02 05:52:47.50'),
      (5 ,'2014-04-02 06:35:48.84'),
      (6 ,'2014-04-02 06:50:49.72'),
      (7 ,'2014-04-02 07:01:02.71'),
      (8 ,'2014-04-02 07:01:04.35'),
      (9 ,'2014-04-02 07:01:09.29'),
      (10,'2014-04-02 07:44:05.71'),
      (11,'2014-04-02 08:37:47.06')
      

      --查询

      SELECT  A.*,B.* 
      FROM    @TAB A,@TAB B 
      WHERE   A.ID = B.ID - 1
      AND     DATEDIFF(SECOND,A.DT,B.DT) > 5
      

      --结果

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-01
        • 1970-01-01
        • 2013-03-22
        • 1970-01-01
        • 2011-12-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-30
        相关资源
        最近更新 更多