我对数据库编程很陌生。
我有一个记录交易行(每个都有唯一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
有什么想法吗?
答案 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