2016-06-07 29 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