sql >> Databasteknik >  >> RDS >> Sqlserver

Hitta saknade tidsintervall i en tabell

Följande bör fungera och returnerar inte bara en enda post för ett enhets-id.

Kontentan av detta är att

  • Lägg till ett radnummer i varje post, sorterat efter Date och starta om för varje DeviceID .
  • Gå med dig själv för att skapa ett resultat med rader som består av en kombination av två ursprungliga rader. Relationen mellan kolumnerna i varje rad är radnumret (+1) och DeviceID .
  • Behåll bara de rader där det relaterade Date är mer än 15 minuter.

SQL-uttalande

;WITH t AS (
  SELECT  *, rn = ROW_NUMBER() OVER (PARTITION BY DeviceID ORDER BY Date)
  FROM    TestTable
)  
SELECT  t1.DeviceID, t1.Date, t2.Date
FROM    t t1
        INNER JOIN t t2 ON t2.DeviceID = t1.DeviceID AND t2.rn = t1.rn + 1
WHERE   DATEDIFF(MINUTE, t1.Date, t2.Date) > 15        

Testskript

;WITH TestTable (ID, DeviceID, Date, Value) AS (
  SELECT 1, 3, '2011-08-24 00:00:00', 0.51 UNION ALL
  SELECT 2, 3, '2011-08-24 00:15:00', 2.9 UNION ALL
  SELECT 3, 3, '2011-08-24 00:30:00', 0 UNION ALL
  SELECT 4, 3, '2011-08-24 00:45:00', 7.1 UNION ALL
  SELECT 5, 3, '2011-08-24 01:00:00', 1.05 UNION ALL
  SELECT 6, 3, '2011-08-24 03:15:00', 3.8 
)
, t AS (
  SELECT  *, rn = ROW_NUMBER() OVER (PARTITION BY DeviceID ORDER BY Date)
  FROM    TestTable
)  
SELECT  t1.DeviceID, t1.Date, t2.Date
FROM    t t1
        INNER JOIN t t2 ON t2.DeviceID = t1.DeviceID AND t2.rn = t1.rn + 1
WHERE   DATEDIFF(MINUTE, t1.Date, t2.Date) > 15        



  1. Fråga med jokertecken och punkt som inte matchar data med Oracle Text-index

  2. Skapa databaser i SQLAlchemy-tester med PostgreSQL

  3. Skillnaden mellan NULL och Blank Value i Mysql

  4. hur man söker i SQL Server 2008 R2 lagrade procedurer för en sträng?