Sql server 按特定间隔筛选行
我在一个表中有以下日期时间值,只有当该值之间的间隔大于5秒时,我才需要过滤该集。这应该是一个特定的日期,从第一行开始 您知道如何使用SQL Server 2012仅在SQL中执行此操作吗Sql server 按特定间隔筛选行,sql-server,database,tsql,sql-server-2012,Sql Server,Database,Tsql,Sql Server 2012,我在一个表中有以下日期时间值,只有当该值之间的间隔大于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-
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
您可以使用lead函数获取下一个日期和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
你可以这样使用它
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
在SQL Server 2012中,您可以使用lead函数,请尝试以下操作
;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
希望这也能对你有所帮助
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')
--质疑
--结果
您的sql版本是什么?我使用的是MS sql 2012,如果第一列中的数字密集(没有间隙),则在a.id=b.id+1和diff(a.timestamp,b.timestamp)>5秒时使用简单的自连接(伪代码)
。否则,您需要一个使用时间戳的相关子查询。我认为,您也可以使用LAG
或LEAD
函数@JimGarrison在性能方面,使用分析函数是否是一个好主意?MSSQL不知道。我使用Postgres。使用您的代码,我得到:关键字“select”附近的语法不正确。请你再核对一下好吗?
SELECT A.*,B.*
FROM @TAB A,@TAB B
WHERE A.ID = B.ID - 1
AND DATEDIFF(SECOND,A.DT,B.DT) > 5