2016-06-07 55 views
1

我对数据库编程相当陌生。查询以识别每个终端ID的差距

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

例如:

PC1将起始于100,并执行交易将去101,102,103,104等

PC2将在200开始,并且将去201,202,203,204 etc

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

我想做一个查询,w在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 

有什么想法?

+0

而且,如果包含样本数据和期望的输出,它会更清晰。 – sstan

+0

我必须指出当PC超过100次交易时会发生什么缺陷,并且他们流入其他范围?总的来说,这是一个糟糕的主意。 – Jeremy

+0

我刚刚使用该范围作为示例,我使用的数据库的ID范围为15位数,因此渗入其他范围不是问题。为了简单起见,我只是使用三位数字的ID – JMac

回答

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 
+0

非常好,非常适合非常感谢你! 如果我曾经处于无法获取PCOffset的情况,我该如何调整查询以适应此? 例如;这些ID有时来自成千上万的单独的个人电脑,它们都会读入一个大型数据库,发现偏移量会很困难,因为每个人都有一个不同的数字范围,它使用多达15位数字。那么是否可以在不需要知道偏移量的情况下运行该查询? 通过PCID和Gap Threshold,这可以让我在每个PC基础上拉回100个ID中的任何间隔,这非常完美。 – JMac

+0

@JMac你需要提供一些关于你的个人电脑方案的细节。您可能需要一个带有PC ID和开始和结束范围的单独表格,以便您可以查询您的范围是否在数学上无法确定。另外,如果有帮助,请接受答案。 :) – Jeremy

+0

啊,我看到了 - 我应该能够解决它,这对我们的结构来说比任何问题都更为棘手。干杯杰里米! – JMac