Je suis assez nouveau à la programmation de database.
J'ai une table qui documente les rangées de transactions (chacune avec un identifiant unique) – l'identifiant unique est défini par le terminal / PC qui traite la transaction.
Par exemple:
PC1 commencera à 100 et les transactions effectuées seront de 101, 102, 103, 104 etc.
PC2 commencera à 200 et ira 201, 202, 203, 204 etc.
Tous sont dans la même table, donc les TransactionID sont confus (ie la première input sera pour PC1, les deux suivantes seront PC2 puis une autre pour PC1 – ceci est dû au fait qu'elles sont classées par horodatage)
Je veux faire une requête qui montrera tous les trous plus grands que 100 dans les identifiants mais seulement pour les identifiants se rapportant à ce PC (sinon les résultats montreront 101 et 204 comme étant un "trou")
Résultat souhaité serait les deux ID avec un écart de 100 plus l'horodatage et le nom du PC.
J'ai fait une requête semblable à ceci avant de find l'écart dans les horodateurs, mais je ne sais pas si l'abvoe est aussi simple. voici cette requête:
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
Des pensées?
Vous pouvez commencer avec ceci, et ajuster au besoin.
J'ai créé quelques variables que vous pouvez modifier pour votre situation, ce qui permettra de définir à quelle distance vos plages sont.
En outre, vous êtes sur la bonne voie avec une auto-participation, j'ai fait un peu de maths pour find les ID différant de plus de 100.
En outre, les sélections pour MinID et MaxID sont simplement pour vous montrer comment la formule fonctionne dans la sélection ci-dessous.
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