查询以基于每个终端识别ID中的间隙

时间:2016-06-07 16:38:04

标签: sql sql-server sql-server-2008-r2

我对数据库编程很陌生。

我有一个记录交易行(每个都有唯一ID)的表 - 唯一ID由处理交易的终端/ PC定义。

例如:

PC1将从100开始,它执行的交易将为101,102,103,104等

PC2将从200开始,将进入201,202,203,204等

所有这些都在同一个表中,因此TransactionID混乱(即第一个条目将用于PC1,接下来的两个将是PC2,然后另一个用于PC1 - 这是由于它们按时间戳排序)

我想创建一个查询,在ID中显示任何大于100的间隙,但仅限于与该PC相关的ID(否则结果将显示101和204为“间隙”)

期望的结果将是两个ID,差距为100加上时间戳和PC名称。

为了找到时间戳中的差距,我之前做了类似的查询,但不确定abvoe是否如此简单。这是查询:

WITH ordered AS
(
  SELECT *, ROW_NUMBER() OVER (ORDER BY date) rn
    FROM Table1 
)
SELECT o1.ID id1, o1.DATE date1, o2.ID id2, o2.DATE date2, DATEDIFF(s, o1.date, o2.date) diff
  FROM ordered o1 JOIN ordered o2
    ON o1.rn + 1 = o2.rn 
 WHERE DATEDIFF(s, o1.date, o2.date) > 120

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以从此开始,并根据需要进行调整。

我创建了一些变量,您可以根据自己的情况进行调整,这些变量将定义您的范围距离。

此外,你在自我加入的正确轨道上,我做了一些数学计算,发现ID差异超过100。

此外,MinID和MaxID的选择只是为了向您展示公式如何工作在下面的选择中。

DECLARE @PCID INT = 1
DECLARE @PCOffset INT = 1000
DECLARE @GapThreshold INT = 100

--let's say we have 1 thousand between stations
SELECT MinID = (@PCID - 1) * @PCOffset

SELECT MaxID = (@PCID) * @PCOffset - 1

CREATE TABLE #IDs (
    MyID INT
    ,date_inserted DATETIME
    )

INSERT INTO #IDs (
    MyID
    ,date_inserted
    )
VALUES (    101 ,'1/1/2016' )
    ,(  102 ,'1/2/2016' )
    ,(  205 ,'1/3/2016' )
    ,(  1500    ,'1/3/2016' ) --out of range

;WITH ordered
AS (
    SELECT myRow = ROW_NUMBER() OVER (
            ORDER BY MyID
            )
        ,MyID
        ,date_inserted
    FROM #IDs
    WHERE MyID BETWEEN ((@PCID - 1) * @PCOffset)
            AND ((@PCID) * @PCOffset - 1)
    )
SELECT o1.MyID
    ,o1.date_inserted
    ,o2.MyID
    ,o2.date_inserted
FROM ordered o1
INNER JOIN ordered o2 ON o1.myRow + 1 = o2.myRow
WHERE o2.MyID - o1.MyID > @GapThreshold

DROP TABLE #IDs