Как отобразить количество «пропущенных» часов в Oracle - PullRequest
0 голосов
/ 19 октября 2018

Я знаю, что это довольно сложно, но я пытаюсь найти количество пропущенных значений (не показанных вообще (вместо нуля)) на основе TABLE1.code, TABLE1.HOUR, TABLE2.DATA_TYPE, TABLE3.FILE_NAME,Кроме того, когда DST меняется осенью и весной, мы всегда ожидаем 24 часа для каждого дня.

Итак, в моей таблице (TABLE1) есть следующие столбцы: VALUE_ID, VALUE, HOUR, CODE, DAY_OF_YEAR

 VALUE_ID      VALUE     HOUR                  CODE      DAY_OF_YEAR     
   1             7       1-1-2018 01:00 AM      HI        0012018
   2             9       1-1-2018 03:00 AM      HI        0012018
   3             22      1-1-2018 04:00 AM      HI        0012018
   4             55      1-1-2018 05:00 AM      HI        0012018
   5             99      1-1-2018 06:00 AM      HI        0012018
   6             77      1-1-2018 07:00 AM      HI        0012018
   7             33      1-1-2018 08:00 AM      HI        0012018

В моей второй таблице (TABLE2) есть следующие столбцы:VALUE_ID, FILE_ID, DATA_TYPE

VALUE_ID          FILE_ID             DATA_TYPE
  1                  1                 REG
  2                  1                 REG
  3                  1                 IRREG
  4                  1                 IRREG
  5                  1                 AB
  6                  1                 AB
  7                  1                 AB

В моей третьей таблице (TABLE3) есть следующий столбец: FILE_ID, File_Name, FILE_DATE

 FILE_ID             FILE_NAME            FILE_DATE
    1               samplefile.csv        10-19-2018

Ниже приведен ожидаемый результат:

 FILE_NAME        DATA_TYPE       CODE      TRUNC(HR)     MissingValues#
 samplefile.csv   REG             HI        1-1-2018        22
 samplefile.csv   IRREG           HI        1-1-2018        22
 sameplfile.csv   AB              HI        1-1-2018        21

Цель: на основе того, какие дни и файлы мы отправили за эти дни, нам нужно найти количество значений, которые не были отправлены за этот день для этого определенного data_type и кода.

1 Ответ

0 голосов
/ 19 октября 2018

В зависимости от того, что вы говорите в комментариях, мы можем ожидать одну запись в час, code, data_type и file_name.Таким образом, мы пересекаем код соединения, data_type и file_name и проверяем, сколько записей (то есть часов) мы фактически находим для комбинации.

Вы узнаете, сколько часов в день вычитая из полуночи дня следующего дняполночь и использование для этого локальных временных отметок, т.е. с учетом часового пояса.

select
  t3.file_name, t2.data_type, t1.code, days.day,
  ( -- 23, 24, or 25 hours
   (to_timestamp_tz(to_char(days.day + 1, 'yyyymmdd'), 'yyyymmdd') -
    to_timestamp_tz(to_char(days.day, 'yyyymmdd'), 'yyyymmdd')) * 24
  ) -
  (
    select count(*)
    from table1 tx1
    join table2 tx2 using (value_id)
    join table3 tx3 using (file_id)
    where tx3.file_name  = t3.file_name
      and tx2.data_type  = t2.data_type
      and tx1.code       = t1.code
      and trunc(tx1.hour) = days.day
  ) as missing_values
from (select distinct trunc(hour) as day from table1) days
cross join (select distinct code from table1) t1
cross join (select distinct data_type from table2) t2
cross join (select distinct file_name from table3) t3;

Этот запрос включает комбинации, в которых нет пропущенных часов (missing_values ​​= 0).Вы, конечно, можете заключить вышеуказанный запрос в основной запрос и отклонить эти строки:

select * from ( above query ) where missing_values > 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...