аналитическая функция оракула - PullRequest
0 голосов
/ 25 апреля 2018

Пожалуйста, дайте мне знать, если следующее не по теме, или не ясно, или слишком конкретно, или слишком сложно для понимания.Я думаю, что описать, понять и решить проблему трудно.

CIF = стоимость, страховка, стоимость (в основном это значение импорта)

Упрощенная версия таблицы ввода (импорт)выглядит следующим образом:

введите здесь описание изображения Таким образом, с января по июнь значение 1 присваивается столбцу SixMonthPeriod, а остальным месяцам присваивается значение 2.

Затем я хочу рассчитать цену за единицу за шесть периодов, поэтому я использую

select SixMonthPeriod, ProductDescrip, Sum(weight), Sum (CIF), (Sum (CIF))/(Sum(weight)) as UnitPrice
from Import
group by SixMonthPeriod, ProductDescrip;

Это хорошо, но затем я хочу рассчитать инфляцию для каждого продукта (за период в шесть месяцев), где мне нужноиспользовать лаг (аналитическая функция оракула).Шестимесячный период должен быть фиксированным.Таким образом, если предыдущий период для определенного товара отсутствует, то цена за единицу должна быть равна нулю.Я хочу заново начать / начать расчет инфляции для каждого продукта.Уравнения цены за единицу и инфляции выглядят следующим образом, соответственно:

цена за единицу = (сумма (вес) за шестимесячный период) / (сумма (CIF) за шестимесячный период) инфляция = (текущая единицацена - предыдущая цена за единицу) / (предыдущая цена за единицу)

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

select Yr, SixMthPeriod, Product, UnitPrice, LagUnitPrice, ((UnitPrice -LagUnitPrice)/LagUnitPrice) as inflation
from (select Year as Yr, SixMonthPeriod as SixMthPeriod, 
ProductDescrip as product, (Sum (CIF))/(Sum(weight)) as UnitPrice, 
lag((Sum (CIF))/(Sum(weight)))
over (partition by ProductDescrip order by YEAR, SixMonthPeriod) as LagUnitPrice
From Import
group by Year, SixMonthPeriod, ProductDescrip)

Проблема в том, что период инфляции не фиксирован.

Например, для результата я получаю следующее:

введите описание изображения здесь Первые двастроки хороши и должны быть нулевые значения, потому что они - моя первая строка, таким образом, нет никакого LagUnitPrice и инфляции.

Третья строка имеет проблему, где она приняла 0.34 как LagUnitPrice, но фактически это ноль (за период 2016, где SixMthPeriod = 1 для ячменя продукта).аналитические функции оракула не учитывают пропущенные строки (например, для периода 2016 года, где SixMthPeriod = 1 для ячменя продукта).

как мне решить эту проблему (если вы меня понимаете)?

У меня 96 строк, поэтому я могу экспортировать файл в Excel и использовать формулы Excel для исправления этих исключений.

1 Ответ

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

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

select product, year, smp, price, prev_price, (price - prev_price) / prev_price inflation 
  from (    
    select product, year, smp, price, 
           lag(price) over (partition by product order by year, smp) prev_price
      from ( 
        select year, ProductDescrip product, SixMonthPeriod smp, sum(CIF)/sum(weight) price
          from Import
          group by year, SixMonthPeriod, ProductDescrip) a
      full join (
        select distinct year, productdescrip product, column_value smp
          from import cross join table(sys.odcinumberlist(1, 2))) b
      using (product, year, smp))
  order by product, year, smp

Демонстрация SQLFiddle

Подзапрос b отвечает за генерацию всех периодов, вы можете запустить его отдельно, чтобы посмотреть, что он производит.

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