Почасовые пробелы в данных за месяц - PullRequest
0 голосов
/ 04 июня 2018

Привет, товарищ StackOverflowers

Я действительно изо всех сил пытаюсь найти правильный подход для этой (на мой взгляд) относительно простой проблемы поиска пробелов.У меня есть таблица с почасовыми датами (почасовой файл журнала импортируется в БД).Мне нужно найти пропущенные часы в течение периода (скажем, в апреле).Итак, представьте, что в таблице БД есть следующие данные [import_logs]

[2018-04-02 10:00:000]
[2018-04-02 11:00:000]
[2018-04-02 12:00:000] 
[2018-04-02 17:00:000]

Мне нужен результат для анализа разрыва в апреле:

[      GAP-BEGIN     ]  [     GAB_END        ]
[2018-04-01 00:00:000]  [2018-04-02 10:00:000] <-- problem
[2018-04-02 13:00:000]  [2018-04-02 17:00:000] <-- can be found using below code
[2018-04-02 18:00:000]  [2018-05-01 00:00:000] <-- problem

Моя проблема состоит в основном в поиске начала и концадиапазоны, но следующий код помогает найти ограничение между доступными данными.

    WITH t AS (
      SELECT  *, rn = ROW_NUMBER() OVER (PARTITION BY zone ORDER BY hourImported)
      FROM  logsImportedTable
      Where hourImported > '2018-04-01' and hourImported < '2018-05-01' and zone = 1
    )  
    SELECT  t1.zone, t1.hourImported as GapStart, t2.hourImported as GapEnd
    FROM    t t1
    INNER JOIN t t2 ON t2.zone = t1.zone AND t2.rn = t1.rn + 1
    WHERE   DATEDIFF(MINUTE, t1.hourImported, t2.hourImported) > 60

, который дает мне только результат:

  [zone] [gap_start              ] [gap_end                ]
  [1   ] [2018-04-02 13:00:00.000] [2018-04-02 17:00:00.000]

Так что, в основном, если журналы не были импортированы во времяАпрель, вообще, текущая реализация не показала бы отсутствующих данных вообще (что-то не так)

Я думаю, что мне нужно каким-то образом добавить несколько новых точек данных непосредственно перед началом и концом периода апреля, чтобы каким-то образом получить запроспоймать начало и конец месяца как отсутствующие данные?Что бы вы умные парни / девушки делали?

/ С уважением

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Хорошо, спасибо большое @Gordon, это мое окончательное решение проблемы.Это даст разрывы, даже если данные за весь месяц отсутствуют и все небольшие разрывы в пределах.

DECLARE @zone INT = 1, @currentPeriodStart DATETIME = '2018-01-01', 
@currentPeriodEnd DATETIME = '2018-02-01';

WITH t AS (
SELECT  *, rn = ROW_NUMBER() over (PARTITION BY zone_id ORDER BY 
time_of_file_present)
FROM  test
Where time_of_file_present > @currentPeriodStart and time_of_file_present < 
@currentPeriodEnd and zone_id = @zone
)  
SELECT  t1.zone_id, t1.time_of_file_present as gap_start, 
t2.time_of_file_present as gap_end
FROM    t t1
    INNER JOIN t t2 ON t2.zone_id = t1.zone_id AND t2.rn = t1.rn + 1
WHERE   DATEDIFF(MINUTE, t1.time_of_file_present, t2.time_of_file_present) >60 

union all
select @zone, @currentPeriodStart, min(lit.time_of_file_present)
from test lit
where lit.time_of_file_present >=  @currentPeriodStart
having min(lit.time_of_file_present) >  @currentPeriodStart and 
min(lit.time_of_file_present) < @currentPeriodEnd

union all
select @zone,max(lit.time_of_file_present), @currentPeriodEnd
from test lit
where lit.time_of_file_present <= @currentPeriodEnd
having max(lit.time_of_file_present) < @currentPeriodEnd and 
max(lit.time_of_file_present) > @currentPeriodStart

union all
select @zone,@currentPeriodStart, @currentPeriodEnd
from test lit
having max(lit.time_of_file_present) < @currentPeriodStart or 
max(lit.time_of_file_present) > @currentPeriodEnd
order by gap_start
0 голосов
/ 04 июня 2018

Для этой ситуации просто добавьте начальные и конечные значения, если необходимо:

<your query here>
union all
select '2018-04-01 00:00:000', min(lit.hourImported)
from logsImportedTable lit
where lit.hourImported >= '2018-04-01 00:00:00'
having min(lit.hourImported) > '2018-04-01 00:00:00'
union all
select '2018-05-01 00:00:000', max(lit.hourImported)
from logsImportedTable lit
where lit.hourImported <= '2018-05-01 00:00:00'
having max(lit.hourImported) > '2018-05-01 00:00:00';
...