sql >> Database teknologi >  >> RDS >> Oracle

SQL-gruppering på tidsinterval

MED ændringer SOM ( VÆLG "DATO", CASE NÅR LAG( "DATO") OVER ( BESTIL EFTER "DATO") + INTERVAL '5' MINUTE ="DATO" SÅ 0 ANDEN 1 SLUT SOM has_changed_group FRA TEST ), grps AS ( VÆLG "DATO", SUM( has_changed_group ) OVER (REGLER EFTER "DATE" RÆKKER MELLEM UBEGRÆNSET FOREGÅENDE OG AKTUELLE RÆKKE) SOM grp FRA ændringer) VÆLG MIN( "DATE") SOM shutdown_start, MAX( "DATE") AS shutdown_end, MAX( "DATE" ) - MIN( "DATE") + INTERVAL '5' MINUTE AS shutdown_durationFROM grpsGROUP BY grp; 

Output:

SHUTDOWN_START SHUTDOWN_END SHUTDOWN_DURATION---------------------------------------- ------------- --------------- ------------------07-JUL-15 12.05.00.000000000 07-JUL-15 12.15.00.000000000 0 0 :15:0.0 07-JUL-15 12.35.00.000000000 07-JUL-15 12.50.00.000000000 0 0:20:0.0 07-JUL-15 13.05.00.000.5 13.05.00.0001:01:01:01:01:01. kode> 

Rediger – Flere maskiner:

SQL Fiddle

Oracle 11g R2 Schema Setup :

OPRET TABELTEST ( MACHINE_ID, "DATE") SOM SELECT 1, TIME STAMP '2015-07-07 12:05:00' FRA DUALUNION ALL SELECT 1, TIMESTAMP '2015-07-07 12:10:00' FRA DUALUNION ALLE VÆLG 1, TIMESTAMP '2015-07-07 12:15:00' FRA DUALUNION ALL SELECT 1, TIMESTAMP '2015-07-07 12:35:00' FRA DUALUNION ALL-TIME STAMP '20 07-07 12:40:00' FRA DUALUNION ALLE VÆLG 1, TIMESTAMP '2015-07-07 12:45:00' FRA DUALUNION ALLE SELECT 1, TIMESTAMP '2015-07-07 12:50:00UNION' FRA ALLUNION VÆLG 1, TIMESTAMP '2015-07-07 13:05:00' FRA DUALUNION ALL SELECT 1, TIMESTAMP '2015-07-07 13:10:00' FRA DUALUNION ALL SELECT 1, TIMESTAMP '2015-107:07 15:00' FRA DUALUNION ALLE VÆLG 2, TIMESTAMP '2015-07-07 12:35:00' FRA DUALUNION ALL SELECT 2, TIMESTAMP '2015-07-07 12:40:00' FRA DUALUNION ALL SELECTAMP 2 2015-07-07 12:45:00' FRA DUALUNION ALL SELECT 2, TIMESTAMP '2015-07-07 13:00:00' FRA DUALUNION ALL SELECT 2, TIMESTAMP '2015-07-07 13:00' FRA:DUALUNION ALL SELECT 2, TIMESTAMP ' 2015-07-07 13:10:00' FRA DUALUNION ALL SELECT 2, TIMESTAMP '2015-07-07 13:15:00' FRA DUAL; 

Forespørgsel 1 :

MED ændringer SOM (VÆLG MACHINE_ID, "DATE", CASE NÅR LAG( "DATE" ) OVER (PARTITION BY MACHINE_ID ORDER BY "DATE" ) + INTERVAL '5' MINUTE ="DATE" SÅ 0 ANDEN 1 AFSLUT AS has_changed_group FRA TEST), grps AS ( SELECT MACHINE_ID, "DATE", SUM( has_changed_group ) OVER ( PARTITION BY MACHINE_ID ORDER BY "DATE" RÆKKER MELLEM UBUNDET FOREGÅENDE OG NUVÆRENDE RÆKKE ) SOM GRP_FRA_VÆLG, TIL MACHINEAR_ID(SELECT) ( "DATE" ), 'ÅÅÅÅ-MM-DD TT24:MI:SS' ) AS shutdown_start, TO_CHAR( MAX( "DATE" ), 'ÅÅÅÅ-MM-DD TT24:MI:SS' ) AS shutdown_end, TO_CHAR( MAX ( "DATE") - MIN( "DATO") + INTERVAL '5' MINUTE ) AS shutdown_durationFROM grpsGROUP BY MACHINE_ID, grpORDER BY 1,2 

Resultater :

| MACHINE_ID | SHUTDOWN_START | SHUTDOWN_END | SHUTDOWN_DURATION ||----------------|----------------------------------- ----------|--------------------------------------|| 1 | 07-07-2015 12:05:00 | 07-07-2015 12:15:00 | +000000000 00:15:00.000000000 || 1 | 07-07-2015 12:35:00 | 07-07-2015 12:50:00 | +000000000 00:20:00.000000000 || 1 | 07-07-2015 13:05:00 | 07-07-2015 13:15:00 | +000000000 00:15:00.000000000 || 2 | 07-07-2015 12:35:00 | 07-07-2015 12:45:00 | +000000000 00:15:00.000000000 || 2 | 07-07-2015 13:00:00 | 07-07-2015 13:15:00 | +000000000 00:20:00.000000000 |

  1. java jdbc mysql-stik:hvordan man løser afbrydelse efter en lang inaktiv tid

  2. Hvordan kontrolleres kolonnen er virtuel i Oracle?

  3. CURDATE() Eksempler – MySQL

  4. Introduktion til PL/SQL-funktioner i Oracle-databasen