Как я могу сгенерировать нули для пропущенных значений идентификатора? - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь сгенерировать вывод, который заполняет отсутствующие значения с 0.

Я использую Oracle SQL.Пока что мое решение основано на Группировании записей по часам или дням и заполнению пробелов нулями или нулями с небольшими добавлениями.

WITH TEMP
     AS ( SELECT MINDT + ( (LEVEL - 1) / 24) DDD
               FROM (SELECT TRUNC (MIN (MY_TIMESTAMP), 'HH24') MINDT,
                            TRUNC (MAX (MY_TIMESTAMP), 'HH24') MAXDT
                       FROM MAIN_TABLE.TABLE_VIEW THV
                      WHERE MY_TIMESTAMP BETWEEN TO_DATE ('08/01/2018:00:00:00',
                                                           'MM/DD/YYYY:HH24:MI:SS')
                                                    AND TO_DATE (
                                                           '08/03/2018:23:59:59',
                                                           'MM/DD/YYYY:HH24:MI:SS')) V
         CONNECT BY MINDT + ( (LEVEL - 1) / 24) <= MAXDT)
  SELECT TO_CHAR (TRUNC (D1, 'HH24'), 'YYYY-MM-DD HH24'), COUNT (D2), ID
    FROM (SELECT NVL (MY_TIMESTAMP, DDD) D1,
                 MY_TIMESTAMP D2,
                 THV.ID ID
            FROM MAIN_TABLE.TABLE_VIEW THV
                 RIGHT OUTER JOIN
                    (SELECT DDD FROM TEMP) AD
                 ON DDD = TRUNC (MY_TIMESTAMP, 'HH24')
           WHERE MY_TIMESTAMP BETWEEN TO_DATE ('08/01/2018:00:00:00',
                                                      'MM/DD/YYYY:HH24:MI:SS')
                                         AND TO_DATE ('08/03/2018:23:59:59',
                                                      'MM/DD/YYYY:HH24:MI:SS'))
GROUP BY ID, TRUNC (D1, 'HH24')
ORDER BY ID, TRUNC (D1, 'HH24')

Сейчас я получаю:

CNT   ID        DT
4     1         2018-08-01 00
1     1         2018-08-01 01
1     1         2018-08-01 04
20    1         2018-08-01 05
76    1         2018-08-01 07

Но я хочу:

CNT   ID        DT
4     1         2018-08-01 00
1     1         2018-08-01 01
0     1         2018-08-01 02
0     1         2018-08-01 03
1     1         2018-08-01 04
20    1         2018-08-01 05
0     1         2018-08-01 06
76    1         2018-08-01 07

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 29 января 2019

Это работает довольно гладко, если у вас есть таблица для соединения, в которой есть все часы, которые вы ожидаете получить в результатах.Чтобы таблица имела все часы, в ней было бы всего 24 записи.

Это может быть временная таблица, но если бы она была реальной таблицей, это упростило бы ваш отчет до стандартного запроса.И если этот отчет используется регулярно, почему бы не иметь дополнительную таблицу?Я видел, что администраторы баз данных имеют общую таблицу «чисел» с множеством чисел для подобных трюков (чтобы получить 0-23, запросите таблицу where n between 0 and 23).В другом примере, если вы хотите, чтобы каждая отдельная дата в течение 90-дневного периода, могла использовать таблицу чисел для 0-89 и добавить это значение к начальной дате, чтобы иметь возможность присоединиться к каждой возможной дате в этом периоде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...