【问题标题】:SQL Lag or Lead - How to select records based on row with a difference in a date/time fieldSQL Lag or Lead - 如何根据日期/时间字段不同的行选择记录
【发布时间】:2013-08-05 13:55:45
【问题描述】:

我有一个包含数百万条记录的表,其中包含日期/时间戳 - 我正在尝试返回存在差异 > 给定秒数的记录。

该表包含日期/时间戳,但我无法使用位置和计算出的差异。 (createddate 是日期字段,updatedon 是日期/时间)

SELECT createddate,
       LEAD(createddate, 1) OVER (ORDER BY createddate) AS created_next,
       LEAD(createddate, 1) OVER (ORDER BY createddate) - createddate AS created_diff, 
       LEAD(updatedon, 1) OVER (ORDER BY updatedon) AS created_next,
       LEAD(createddate, 1) OVER (ORDER BY updatedon) - updatedon AS Updatedon_diff
FROM   gsdaudit
--WHERE created_diff >  1000
ORDER BY updatedon_diff

【问题讨论】:

  • 您要返回哪条记录?差距之前的一个,差距之后的一个还是两者都有?
  • 如果可能的话,一个或两个 - 我只是在测试一个差距 > # of seconds

标签: sql lag sliding-window


【解决方案1】:

最简单的方法(假设是 SQL 服务器)可能是使用DATEDIFF 来获取以秒为单位的差异,并将计算放在一个公用表表达式中;

WITH cte AS (
  SELECT 
    createddate,
    DATEDIFF(second, createddate, 
             LEAD(createddate, 1) OVER (ORDER BY createddate)) created_diff,
    updatedon,
    DATEDIFF(second, createddate, 
             LEAD(updatedon,   1) OVER (ORDER BY updatedon  )) updatedon_diff
  FROM   gsdaudit
)
SELECT * FROM cte 
WHERE created_diff >  10 OR updatedon_diff > 10

An SQLfiddle to test with.

编辑:Oracle 的相同查询;

WITH cte AS (
  SELECT 
    createddate,
    (LEAD(createddate, 1) OVER (ORDER BY createddate)-createddate)*24*60*60 created_diff,
    updatedon,
    (LEAD(updatedon, 1) OVER (ORDER BY updatedon)-updatedon)*24*60*60 updatedon_diff
  FROM   gsdaudit
)
SELECT * FROM cte 
WHERE created_diff >  10 OR updatedon_diff > 10

Another SQLfiddle.

【讨论】:

  • 感谢您提供的信息 - 我在 oracle 工作,您是否有任何关于我可以用来替换 datediff 函数的信息,或者一个示例会非常棒。
猜你喜欢
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多