从SQL表中查找不连续性

从SQL表中查找不连续性,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,对于我的问题可能有一个非常简单的解决方案,但我有一个很好的touble为它制定了一个很好的搜索短语。我有一个包含时间戳和计数的表: 2013-08-15 14:43:58.447 5 2013-08-15 14:44:58.307 12 2013-08-15 14:45:58.383 14 2013-08-15 14:46:58.180 0 2013-08-15 14:47:58.210 4 2013-08-15 14:48:58.287 6 2013-08-

对于我的问题可能有一个非常简单的解决方案,但我有一个很好的touble为它制定了一个很好的搜索短语。我有一个包含时间戳和计数的表:

2013-08-15 14:43:58.447    5
2013-08-15 14:44:58.307    12
2013-08-15 14:45:58.383    14
2013-08-15 14:46:58.180    0
2013-08-15 14:47:58.210    4
2013-08-15 14:48:58.287    6
2013-08-15 14:49:58.550    12
2013-08-15 14:50:58.440    2
2013-08-15 14:51:58.390    5
如您所见,计数增加,然后每隔一段时间清空一次。搜索count=0的行很容易,但有时会在记录零数之前增加计数。在14:49,计数为12,然后重置为0,并在14:50的下一个日志之前增加为2

我需要列出计数小于之前计数的时间戳:

2013-08-15 14:46:58.180    0
2013-08-15 14:50:58.440    2

我开始对表本身进行连接,以比较两行,但SQL很快变得非常混乱。

这样做的目的是基于ts datetime列创建一个行号,然后更容易连接到上一个条目。然后比较时间和计数以查找异常

;with cte as 
(
    select * ,
      ROW_NUMBER() over (order by ts) rn    
    from yourtable
)
    select c1.* from cte c1
        inner join cte c2
            on c1.rn=c2.rn+1
            and c1.c < c2.c
使用该功能,您可以在订单上指定号码,并将其用于加入:

WITH CTE_RN AS
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY [TimeStamp]) RN
    FROM Table1
)
SELECT r2.* 
FROM CTE_RN r1
    INNER JOIN CTE_RN r2 ON r1.RN +1 = r2.RN
WHERE r1.count > r2.count

在这种情况下,您还可以使用以下功能:

with CTE as
(
select t.*, LEAD(ct) OVER (ORDER BY dt DESC) as LEAD_CT from t
)  
select dt,ct from CTE where LEAD_CT>CT
UPD:可从SQLServer2012版本获得。在2008年,您可以将其替换为子查询:

select *
      FROM T as T1
      where (SELECT TOP 1 ct FROM T 
                             WHERE T.dt<T1.DT
                             ORDER BY dt DESC) >CT

如果你能把它们放在一个索引顺序正确的表中,那么连接应该非常简单,但是,我不能真正地看到简单的解决方案。添加一个表,其中第1行有第1行,第2行有第2行等等。然后您可以选择T2.ID= T1。ID+1和T2.NUMITY问题可能有一些用途,我实际上不会比较TS,而是将计数作为第二个排序参数减少,因为在同一个TS中可以考虑2个计数值。这也是一个异常现象。不是在SQL 2008中你不能。但是,尽管如此,MSSQLS2012中有一个很好的特性!无论如何,谢谢你给我们看-@波迪卢斯卡:你说得对。很抱歉,我错过了sql-server-2008标签:太糟糕了,我被2008困住了,因为这是一个很好的干净解决方案。哇。。。我预计子查询的速度会比podiluska和Nenad Zivkovic的建议慢。检查我的200k行表上的执行计划,查询成本为1:11,支持子查询版本。请注意,不要猜测哪个查询运行得更快。。。