Нахождение разницы между двумя строками, сгруппированными по дате или между двумя поворотными столбцами - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть набор значений для двух разных дат в моем отчете OBIEE:

------------------------------------------------------------------
Option   Date     Value 
------|---------|-------
OPT1    Date 1    5     
OPT1    Date 2    2     
OPT2    Date 1    9     
OPT2    Date 2    1     
OPT3    Date 1    7     
OPT3    Date 2    13    
OPT4    Date 1    5     
OPT4    Date 2    6   

Я надеюсь получить разницу значений для каждого набора дат и представить данные в следующем формате, сгруппированном по опциям:

Option  Date               Diff
        Date 1   Date 2 
------|--------|--------|-------  
OPT1    5        2        3
OPT2    9        1        8
OPT3    7        13       -6
OPT4    5        6        -1

Часть Date может быть обработана с помощью Pivot, однако я не могу найти разницу между теперь развернутыми столбцами.

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

Option  Date      Value   Diff
-------|---------|-------|-------
OPT1    Date 1    5       null
OPT1    Date 2    2        3
OPT2    Date 1    9       null
OPT2    Date 2    1        8
OPT3    Date 1    7       null
OPT3    Date 2    13       -6
OPT4    Date 1    5       null 
OPT4    Date 2    6       -1

Любая помощь приветствуется.

Спасибо, Junaid

Ответы [ 2 ]

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

ОК, я думаю, что у меня есть решение для вычитания строк, разделенное опцией

VALUE - LAG (VALUE, 1, NULL) ПЕРЕВЕРНУТЬСЯ (РАЗДЕЛЕНИЕ ПО ВАРИАНТУ ПОРЯДОК ОПЦИИ)

Однако из-за определенных ограничений я не могу использовать функции БД в OBIEE. Я хотел бы узнать о решении, которое не включает использование функций БД (например, LAG / LEAD).

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

Вы можете ссылаться и выполнять вычисления, используя столбцы, сгенерированные предложением pivot.Предполагая, что у вас есть какое-то ключевое значение, связывающее пары значений для дат 1 и 2, вы можете сделать что-то вроде:

-- CTE for sample data, with made-up keys
with your_table (some_key, some_date, value) as (
            select 1, date '2019-04-01', 5 from dual
  union all select 1, date '2019-04-15', 2 from dual
  union all select 2, date '2019-04-01', 9 from dual
  union all select 2, date '2019-04-15', 1 from dual
  union all select 3, date '2019-04-01', 7 from dual
  union all select 3, date '2019-04-15', 13 from dual
  union all select 4, date '2019-04-01', 5 from dual
  union all select 4, date '2019-04-15', 6 from dual
)
-- actual query
select some_key, date1, date2, date1 - date2 as diff
from your_table
pivot (max(value) for some_date in (date '2019-04-01' as date1, date '2019-04-15' as date2))
order by some_key;

  SOME_KEY      DATE1      DATE2       DIFF
---------- ---------- ---------- ----------
         1          5          2          3
         2          9          1          8
         3          7         13         -6
         4          5          6         -1

В выражении date1 - date2 as diff, date1 и date2 являются именами /псевдонимы из стержня.Обычно вы не можете использовать псевдоним столбца на том же уровне запроса, который его определяет, но pivot позволяет вам избежать неприятностей.

...