Как получить функцию MAX / MIN для каждого месяца в моем наборе данных? - PullRequest
0 голосов
/ 10 апреля 2019

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

В моем коде я смотрю только на январь 2018 года, поэтому найти значения Max и Min на основе текущего набора данных довольно просто. Если бы я расширил его на весь 2018 год, я бы в настоящее время показывал МАКС и МИН на весь год.

      SELECT DISTINCT
         bi_vwn_co_acct,
         bi_consumer_view_1.bi_format_name,
         bi_srv_loc.bi_city,
         bi_srv_loc.bi_st,
         bi_srv_loc.bi_x_coord,
         bi_srv_loc.bi_y_coord,
         bi_interval_rdgs.bi_mtr_nbr,
         MAX (bi_interval_rdgs.bi_rdg),
         MIN (bi_interval_rdgs.bi_rdg),
         (MAX (bi_interval_rdgs.bi_rdg) - MIN (bi_interval_rdgs.bi_rdg))
            AS monthusage
    FROM bi_srv_loc
         INNER JOIN bi_srv_link
            ON bi_srv_loc.bi_srv_loc_nbr = bi_srv_link.bi_srv_loc_nbr
         INNER JOIN bi_type_service
            ON bi_srv_link.bi_srv_loc_nbr = bi_type_service.bi_srv_loc_nbr
         INNER JOIN bi_consumer_view_1
            ON bi_type_service.bi_acct = bi_consumer_view_1.bi_vwn_co_acct
         INNER JOIN bi_interval_rdgs
            ON bi_srv_link.bi_mtr_nbr = bi_interval_rdgs.bi_mtr_nbr
   WHERE     bi_interval_rdg_dt_tm >= '01-JAN-2018'
         AND bi_interval_rdg_dt_tm <= '31-JAN-2018'
         AND bi_type_service.bi_srv_stat_cd IN ('1',
                                                '7',
                                                '18',
                                                '21',
                                                '22',
                                                '30')
GROUP BY bi_consumer_view_1.bi_vwn_co_acct,
         bi_consumer_view_1.bi_format_name,
         bi_srv_loc.bi_x_coord,
         bi_srv_loc.bi_y_coord,
         bi_interval_rdgs.bi_mtr_nbr,
         bi_srv_loc.bi_city,
         bi_srv_loc.bi_st

Я надеюсь получить список данных, который выглядит примерно так:

ACCT1 JAN MONTHUSAGE: 10
ACCT1 FEB MONTHUSAGE: 13
ACCT1 MAR MONTHUSAGE: 12
...
ACCT2 JAN MONTHUSAGE: 23
ACCT2 FEB MONTHUSAGE: 18

Очевидно, что в моем коде показано больше полей, но в целом это то, что мне нужно. Каким-то образом мне нужно пройти через определенный диапазон дат и разбить его на месяц. Буду очень признателен за любую помощь или руководство!

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Я не уверен, что понял, какой столбец (из всех) представляет значение данных, поэтому - вот пример, основанный на образце схемы Скотта, который может дать вам идею - извлечь месяц и год информацию из столбца даты (например, с помощью функции TO_CHAR) и включите его в предложение GROUP BY.

SQL> select to_char(e.hiredate, 'yyyymm') mon,
  2         min(e.sal) minsal,
  3         max(e.sal) maxsal
  4  from emp e
  5  group by to_char(e.hiredate, 'yyyymm')
  6  order by to_char(e.hiredate, 'yyyymm');

MON        MINSAL     MAXSAL
------ ---------- ----------
198012        800        800
198102       1250       1600
198104       2975       2975
198105       2850       2850
198106       2450       2450
198109       1250       1500
198111       5000       5000
198112        950       3000
198201       1300       1300
198212       3000       3000
198301       1100       1100

11 rows selected.

SQL>
0 голосов
/ 10 апреля 2019

Настройте свой запрос также на GROUP BY MONTH(BI_INTERVAL_RDG_DT_TM), YEAR(BI_INTERVAL_RDG_DT_TM )

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