Использование PostgreSQL с Pentaho

Я создал соединение с БД на одном из шагов Pentaho. Я переношу свою среду с Oracle на PostgreSQL. Будучи совершенно новым для PostgreSQL, я не могу избавиться от ошибок. Присоединение выглядит следующим образом:

select t.contract,
   t.calender,
   t.mspprovider,
   t.mspcustomer,
   t.objectname,
   t.granularity,
   t.timeperiod,
   cast(max(t.value) as numeric) as Value,
   null as correctedvalue,
   t.valueunit,
   max(t.violated) as violated,
   null as violatedcorr,
   t.severity,
   t.relation,
   t.target,
   t.targetunit,
   t.targetperiod,
   t.calculationtype,
   t.aggregationtype,
   current_date as createdate,
   current_date as modifydate
from (select a.contract,
           a.calender,
           a.mspprovider,
           a.mspcustomer,
           a.objectname,
           ? as granularity,
           ? as timeperiod,
           Round(Round((sum(a.value)) / sum(a.anzahl)) / 3600 + 0.0004, 3) - 0.001, 2) as value,
           *****'Hour'***** as valueunit
           *****(case
             when Round(Round((sum(a.value) / sum(a.anzahl)) / 3600 + 0.0004, 3) - 0.001, 2) > b.target Then
              'YES'
             Else
              'NO'
           END)** as violated***,
           a.severity,
           a.relation,
           b.target,
           b.targetunit,
           b.targetperiod,
           a.calculationtype as calculationtype,
           b.calculationtype as aggregationtype
      from (select a.contract,
                   a.calender,
                   a.mspprovider,
                   a.mspcustomer,
                   a.objectname,
                 cast(sum(a.durationmodified) as numeric) as Value,  
                   a.severity,
                   a.relation,
                   a.calculationType as calculationtype,
                   a.originatorid,
                   a.calculationversion,
                   count(*) as anzahl
              from result_slalom a,
                   (select a.contract,
                           a.calender,
                           a.mspprovider,
                           a.mspcustomer,
                           a.objectname,
                           a.eventid,
                           a.calculationtype,
                           max(a.calculationversion) as calculationversion
                      from result_slalom a
                     group by a.contract,
                              a.calender,
                              a.mspprovider,
                              a.mspcustomer,
                              a.objectname,
                              a.eventid,
                              a.calculationtype
                     order by 1 asc, 2 asc, 6 asc, 7 asc, 8 asc) b
             where a.endkeydate >= ?
               and a.endkeydate < ?
               and b.contract = a.contract
               and b.calender = a.calender
               and b.mspprovider = a.mspprovider
               and b.mspcustomer = a.mspcustomer
               and b.objectname = a.objectname
               and b.eventid = a.eventid
               and b.calculationtype = a.calculationtype
               and a.calculationversion = b.calculationversion
               and a.impact = 'YES'
             group by a.contract,
                      a.calender,
                      a.mspprovider,
                      a.mspcustomer,
                      a.objectname,
                      a.severity,
                      a.relation,
                      a.originatorid,
                      a.calculationtype,
                      a.calculationversion
             order by 1 asc, 2 asc, 7 asc, 9 asc) a,
           contract_target_mapping b
     where b.contract = a.contract
       and b.calender = a.calender
       and b.calculationtype = 'M' || a.calculationtype
       and b.severity = a.severity
       and b.target not in ('Dynamic')
     group by a.contract,
              a.calender,
              a.mspprovider,
              a.mspcustomer,
              a.objectname,
              a.severity,a.relation,
              b.target,
              b.targetunit,
              b.targetperiod,
              a.calculationtype,
              b.calculationtype 
    union
    select c.contract,
           c.calender,
           c.mspprovider,
           c.mspcustomer,
           o.objectname as objectname,
           ? as granularity,
           ? as timeperiod,
            null as value,
           'Hour' as valueunit,
           'NO' as violated,
           c.severity,
           c.relation,
           c.target,
           c.targetunit,
           c.targetperiod,
           SubStr(c.calculationtype, 2, 200) as calculationtype,
           'M' || SubStr(c.calculationtype, 2, 200) as aggregationtype
      from contract_target_mapping c
           ***Inner Join originator o on o.mspprovider = c.mspprovider and o.mspcustomer = c.mspcustomer
     where c.CalculationType in ('MTTA','MTTR') ) t***
 group by t.contract,
      t.calender,
      t.mspprovider,
      t.mspcustomer,
      t.objectname,
      t.granularity,
      t.timeperiod,
      t.valueunit,
      t.severity,
      t.relation,
      t.target,
      t.targetunit,
      t.targetperiod,
      t.calculationtype,
      t.aggregationtype


order by 1 asc, 2 asc, 12 asc

Это соединение отлично работает в Oracle. Пытался использовать его в PostgreSQL, но он выдает несколько ошибок, и ошибки возникают в следующих местах (также отмечены жирным шрифтом в запросе):

  1. «Час» как единица измерения,

  2. (случай, когда Round(Round((sum(a.value) / sum(a.anzahl)) / 3600 + 0,0004, 3) - 0,001, 2) > b.target Then 'YES' Else 'NO' END) как нарушенный ,

  3. Инициатор внутреннего соединения o в o.mspprovider = c.mspprovider и o.mspcustomer = c.mspcustomer, где c.CalculationType in ('MTTA','MTTR') ) t

Я не пошел дальше, так как застрял на этих ошибках. Пожалуйста, не стесняйтесь указывать на любые другие ошибки, если вы видите. Любая помощь приветствуется. Заранее спасибо.


person Pranjal Kaushik    schedule 13.09.2017    source источник


Ответы (1)


Я понимаю, что быстро и легко скопировать/вставить запрос в поле входной таблицы.

Однако шаг входной таблицы является реализацией, а не абстракцией, что означает, что вы зависите от диалекта sql, а также от более скрытых мелочей, таких как зарезервированные слова [значение непосредственно перед «Часами»], область действия [нарушение определено дважды], двойные кавычки вместо простых, формат даты и т. д.

Если вы хотите использовать чайник в качестве абстракции, не делайте ничего, кроме «ВЫБЕРИТЕ ИЗ таблицы, ГДЕ ЗАКАЗАТЬ ПО» в шагах входной таблицы и выполните логику в чайнике.

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

Также заменить? с ${parameter}, где параметр — это имя поля, определенного на предыдущем шаге. Его намного проще поддерживать, и через несколько месяцев вы обнаружите, что полезно повторно использовать преобразование в циклах и сложных заданиях.

person AlainD    schedule 13.09.2017