Beste Tweakers,
Ik zoek een functie of query om een tabel met logs met een start en eind datum te verdelen in bins/buckets met een interval van X (in dit geval 15 minuten). Ik heb tevens een time tabel met alle 86,400 seconden in een dag waar ik de start en eind tijden van elk interval blok kan joinen per log, samen met een rank van dat blok en het verschil tussen de ranks van het start- en eindblok Ter referentie:
logs
Hierop join ik de time tabel op zowel start als eind timestamp van de log waardoor ik dit resultaat krijg:
logs
Ik wil hier nu graag een tabel van genereren die de missende tussenintervallen genereert en de logs over die intervallen verspreid:
logs
Let op het record met -95, omdat de start en eind datum op een andere dag liggen (startblok is 96 (23:45-00:00) en eindblok is 1 (00:00-00:15)). Logs met een duration van langer dan 24uur zullen niet voorkomen dus we kunnen simpel stellen:
CASE diffStartEndBlock
WHEN 0 -->> return gewoon de originele log
WHEN > 0 Voeg het verschil toe en verdeel de logs over hun tijdsblokken
WHEN < 0 Voeg het (96 + verschil) toe en verdeel de logs over hun tijdsblokken
Hoe kan ik dit het beste aaanpakken? Ik weet dat het met de info die ik al heb met een recursieve CTE of een functie vrij makkelijk moet kunnen maar mis even wat SQL skills hier... Het gaat overigens over Azure SQL in dit geval, maar een andere taalspecifieke oplossing mag uiteraard ook!
Ik zoek een functie of query om een tabel met logs met een start en eind datum te verdelen in bins/buckets met een interval van X (in dit geval 15 minuten). Ik heb tevens een time tabel met alle 86,400 seconden in een dag waar ik de start en eind tijden van elk interval blok kan joinen per log, samen met een rank van dat blok en het verschil tussen de ranks van het start- en eindblok Ter referentie:
logs
id | start | end | duration | status |
1 | 2023-10-13 14:58:10 | 2023-10-13 14:59:20 | 70 | Sleeping |
2 | 2023-10-13 14:59:20 | 2023-10-13 15:02:20 | 180 | Available |
3 | 2023-10-13 14:02:20 | 2023-10-13 15:02:20 | 3600 | Available |
4 | 2023-10-12 23:59:05 | 2023-10-13 00:01:05 | 120 | Connected |
Hierop join ik de time tabel op zowel start als eind timestamp van de log waardoor ik dit resultaat krijg:
logs
id | start | end | duration | status | blockStartofStart | blockEndofEnd | diffStartEndBlock |
1 | 2023-10-13 14:58:10 | 2023-10-13 14:59:20 | 70 | Sleeping | 14:45:00 | 15:00:00 | 0 |
2 | 2023-10-13 14:59:20 | 2023-10-13 15:02:20 | 180 | Available | 14:45:00 | 15:15:00 | 1 |
3 | 2023-10-13 14:02:20 | 2023-10-13 15:02:20 | 3600 | Available | 14:00:00 | 15:15:00 | 4 |
4 | 2023-10-12 23:59:05 | 2023-10-13 00:01:05 | 120 | Connected | 23:45:00 | 00:15:00 | -95 |
Ik wil hier nu graag een tabel van genereren die de missende tussenintervallen genereert en de logs over die intervallen verspreid:
logs
id | start | end | duration | status | blockStartofStart | blockEndofEnd | diffStartEndBlock |
1 | 2023-10-13 14:58:10 | 2023-10-13 14:59:20 | 70 | Sleeping | 14:45:00 | 15:00:00 | 0 |
2 | 2023-10-13 14:59:20 | 2023-10-13 15:00:00 | 40 | Available | 14:45:00 | 15:00:00 | 0 |
3 | 2023-10-13 15:00:00 | 2023-10-13 15:02:20 | 120 | Available | 15:00:00 | 15:15:00 | 0 |
4 | 2023-10-13 14:02:20 | 2023-10-13 15:15:00 | 760 | Available | 14:00:00 | 14:15:00 | 0 |
5 | 2023-10-13 14:15:00 | 2023-10-13 14:30:00 | 900 | Available | 14:15:00 | 14:30:00 | 0 |
6 | 2023-10-13 14:30:00 | 2023-10-13 14:45:00 | 900 | Available | 14:30:00 | 14:45:00 | 0 |
7 | 2023-10-13 14:45:00 | 2023-10-13 15:00:00 | 900 | Available | 14:45:00 | 15:00:00 | 0 |
8 | 2023-10-13 15:00:00 | 2023-10-13 15:02:20 | 140 | Available | 15:00:00 | 15:15:00 | 0 |
9 | 2023-10-12 23:59:05 | 2023-10-13 00:00:00 | 55 | Connected | 23:45:00 | 00:00:00 | 0 |
10 | 2023-10-13 00:00:00 | 2023-10-13 00:01:05 | 65 | Connected | 00:00:00 | 00:15:00 | 0 |
Let op het record met -95, omdat de start en eind datum op een andere dag liggen (startblok is 96 (23:45-00:00) en eindblok is 1 (00:00-00:15)). Logs met een duration van langer dan 24uur zullen niet voorkomen dus we kunnen simpel stellen:
CASE diffStartEndBlock
WHEN 0 -->> return gewoon de originele log
WHEN > 0 Voeg het verschil toe en verdeel de logs over hun tijdsblokken
WHEN < 0 Voeg het (96 + verschil) toe en verdeel de logs over hun tijdsblokken
Hoe kan ik dit het beste aaanpakken? Ik weet dat het met de info die ik al heb met een recursieve CTE of een functie vrij makkelijk moet kunnen maar mis even wat SQL skills hier... Het gaat overigens over Azure SQL in dit geval, maar een andere taalspecifieke oplossing mag uiteraard ook!