Счетчик хода на основе даты - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть таблица с историей предупреждений, которая содержит дату начала, дату окончания и причину предупреждения.

Я хочу, чтобы для каждой даты за последние 30 дней было рассчитано общее количество предупреждений, которые произошли в тот день, это означает, чтоесли оповещение началось в первый день и все еще продолжается (конечная дата равна нулю), оно будет учитываться для всех дней от первого до последнего.

Это запрос, который я получил с

select cal.trunc_date,assets.group_id,
       alert.*,
       count( alert.asset_id)
             over (PARTITION BY alert.REASON_ID ORDER BY 
                 cal.trunc_date) TOTAL_ASSETS
from g_alert_history alert,
  v_app_calendar cal,V_ACTIVE_ASSETS assets
where REASON_ID in (1,2)
  and assets.asset_id=alert.asset_id
  and assets.group_id=1462
  and cal.trunc_date >= trunc(systimestamp - 30)
  and alert.START_DATE_DEVICE >= trunc(systimestamp - 30)
  and alert.START_DATE_DEVICE >= cal.trunc_date
  and alert.START_DATE_DEVICE  <= cal.trunc_date +1
  and nvl (alert.END_DATE_DEVICE, systimestamp)
  >=cal.trunc_date;

Просмотр v_app_calendar содержит даты, а V_ACTIVE_ASSETS содержит group_id, которые я хочу проверить.

Проблема в том, что я получаю дубликаты, дубликаты и т. Д.

Вот результат:

TRUNC_DATE  GROUP_ID  REASON_ID  ASSET_ID  GEOFENCE_ID  START_DATE_DEVICE                END_DATE_DEVICE                  TOTAL_ASSETS
---------   --------  ---------  --------  -----------  -------------------------------  -------------------------------  ------------
03-FEB-19       1462          1      1704          134  03-FEB-19 11.50.09.385000000 AM                                             13
03-FEB-19       1462          1      1704          134  03-FEB-19 11.55.09.475000000 AM                                             13
03-FEB-19       1462          1      1704          134  03-FEB-19 12.00.10.073000000 PM                                             13
03-FEB-19       1462          1      1704          134  03-FEB-19 12.05.11.126000000 PM                                             13
03-FEB-19       1462          1      1704          134  03-FEB-19 12.10.12.668000000 PM                                             13
03-FEB-19       1462          1      1704          134  03-FEB-19 12.15.12.858000000 PM                                             13
03-FEB-19       1462          1      1704          134  03-FEB-19 11.45.09.283000000 AM                                             13
03-FEB-19       1462          1      1704          134  03-FEB-19 11.20.03.587000000 AM                                             13
03-FEB-19       1462          1      1704          134  03-FEB-19 11.25.05.434000000 AM                                             13
03-FEB-19       1462          1      1704          134  03-FEB-19 11.30.07.294000000 AM                                             13
03-FEB-19       1462          1      1704          134  03-FEB-19 11.35.09.141000000 AM                                             13
03-FEB-19       1462          1      1704          134  03-FEB-19 11.40.09.251000000 AM                                             13
03-FEB-19       1462          1      1704          134  03-FEB-19 12.20.14.178000000 PM                                             13
05-FEB-19       1462          1      1663          134  05-FEB-19 02.33.02.475000000 PM                                             14
09-FEB-19       1462          1      1663          134  09-FEB-19 09.33.02.475000000 PM  09-FEB-19 11.33.22.475000000 PM            16
09-FEB-19       1462          1      1782          149  09-FEB-19 02.33.02.475000000 PM  09-FEB-19 02.36.02.475000000 PM            16
11-FEB-19       1462          1      2647          134  11-FEB-19 09.56.08.325000000 AM                                            140
11-FEB-19       1462          1      2647          164  11-FEB-19 09.56.08.325000000 AM                                            140
11-FEB-19       1462          1      2646          164  11-FEB-19 10.03.31.611000000 AM                                            140
11-FEB-19       1462          1      2646          134  11-FEB-19 10.03.31.611000000 AM                                            140
11-FEB-19       1462          1      1781          164  11-FEB-19 10.14.09.612000000 AM                                            140
11-FEB-19       1462          1      2647          134  11-FEB-19 11.55.20.281000000 AM                                            140
11-FEB-19       1462          1      1781          134  11-FEB-19 10.14.09.612000000 AM                                            140
11-FEB-19       1462          1      2647          164  11-FEB-19 10.55.32.300000000 AM                                            140
11-FEB-19       1462          1      1781          134  11-FEB-19 02.52.45.104000000 PM                                            140
11-FEB-19       1462          1      1781          164  11-FEB-19 03.20.40.461000000 PM                                            140
11-FEB-19       1462          1      1781          134  11-FEB-19 03.20.40.461000000 PM                                            140
11-FEB-19       1462          1      1781          164  11-FEB-19 08.28.13.331000000 PM                                            140
11-FEB-19       1462          1      1781          134  11-FEB-19 08.28.13.331000000 PM                                            140
11-FEB-19       1462          1      1781          134  11-FEB-19 03.20.42.461000000 PM                                            140
11-FEB-19       1462          1      1781          134  11-FEB-19 08.28.25.939000000 PM                                            140
11-FEB-19       1462          1      1781          164  11-FEB-19 08.28.25.939000000 PM                                            140

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Попробуйте следующий код.

Таблица дат содержит все даты за последние 30 дней, включая сегодняшний день.

Я также изменил ваш синтаксис JOIN на более новую форму.

with dates as (
    select trunc(sysdate) - (level - 1) trunc_date from dual connect by level<=30
)
select dates.trunc_date
     , count(alert.asset_id)
  from g_alert_history alert
  join v_app_calendar cal
    on (alert.START_DATE_DEVICE between cal.trunc_date and (cal.trunc_date +1)
        and nvl (alert.END_DATE_DEVICE, systimestamp) >= cal.trunc_date )
  join V_ACTIVE_ASSETS assets
    on (assets.asset_id=alert.asset_id)
 where REASON_ID in (1,2)
   and dates.trunc_date between trunc(alert.START_DATE_DEVICE) and nvl(alert.END_DATE_DEVICE, trunc(sysdate))
   and cal.trunc_date >= trunc(systimestamp - 30)
   and assets.group_id=1462
 group by dates.trunc_date

Надеюсь, я помог!

0 голосов
/ 16 февраля 2019

Поскольку требуется ежедневный подсчет всех сигналов тревоги, возникающих в этот день (сигнал тревоги мог начаться в предыдущий день или закончиться в будущий день), то вы хотите использовать совокупный счетчик, сгруппированный по дням (и, возможно, другиекритерии), а не аналитический счет, как вы показали в своем запросе.Чтобы выполнить агрегирование без лишних дубликатов за определенный день, необходимо исключить столбцы, которые предоставляют нечеткие значения.В основном это ваши даты начала и окончания оповещения, а также asset_id и geofence_id.

. Приведенный ниже запрос даст вам количество изменений, произошедших за запрошенные group_id и reason_id с.за каждый из последних 30 дней.

select cal.trunc_date
     , assets.group_id
     , alert.reason_id
     , count( alert.asset_id) TOTAL_ASSETS
  from g_alert_history alert
  join V_ACTIVE_ASSETS assets
    on assets.asset_id=alert.asset_id
  join v_app_calendar cal
    on alert.START_DATE_DEVICE < cal.trunc_date + 1
   and (alert.END_DATE_DEVICE is null or cal.trunc_date <= alert.END_DATE_DEVICE)
 where alert.REASON_ID in (1,2)
   and assets.group_id=1462
   and cal.trunc_date between trunc(sysdate - 30) and sysdate
 group by cal.trunc_date
     , assets.group_id
     , alert.reason_id
 order by cal.trunc_date
     , assets.group_id
     , alert.reason_id;
0 голосов
/ 15 февраля 2019

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

что-то вроде ниже -

select cal.trunc_date,assets.group_id,
       alert.req_col,
       cast(alert.start_date_device as date),
       cast(alert.end_date_device as date)
       count( alert.asset_id)
             over (PARTITION BY alert.REASON_ID ORDER BY 
                 cal.trunc_date) TOTAL_ASSETS
from g_alert_history alert,
  v_app_calendar cal,V_ACTIVE_ASSETS assets
where REASON_ID in (1,2)
  and assets.asset_id=alert.asset_id
  and assets.group_id=1462
  and cal.trunc_date >= trunc(systimestamp - 30)
  and alert.START_DATE_DEVICE >= trunc(systimestamp - 30)
  and alert.START_DATE_DEVICE >= cal.trunc_date
  and alert.START_DATE_DEVICE  <= cal.trunc_date +1
  and nvl (alert.END_DATE_DEVICE, systimestamp)
  >=cal.trunc_date;

Данные, которые вы предоставилине является дубликатом, поскольку содержит уникальную метку времени для каждой записи.

Надеюсь, это поможет

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