Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Znajdź brakujące przedziały czasowe w tabeli

Poniższe powinno działać i nie zwracać tylko jednego rekordu dla identyfikatora urządzenia.

Istotą tego jest

  • Dodaj numer wiersza do każdego rekordu, uporządkowany według Date i ponowne uruchamianie dla każdego DeviceID .
  • Połącz ze sobą, aby utworzyć wynik z wierszami składającymi się z kombinacji dwóch oryginalnych wierszy. Relacja między kolumnami każdego wiersza to numer wiersza (+1) i DeviceID .
  • Zachowaj tylko te wiersze, w których powiązana Date trwa dłużej niż 15 minut.

Oświadczenie SQL

;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        

Skrypt testowy

;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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie kursora w dbMail na serwerze sql 2008

  2. Kolejność instrukcji SQL Select bez klauzuli Order By

  3. Problemy z instrukcją SQL Server MERGE

  4. Czy istnieje sposób na wyłączenie niejawnej konwersji typu w SQL Server?

  5. Instrukcja SQL IF jest ignorowana