Функция SQL Window Max (), имеющая проблемы в коде - PullRequest
0 голосов
/ 07 ноября 2019

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

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

Я оставил свой код ниже. Пожалуйста, помогите.

SELECT 
  gb1.SKU_Id,
  gb1.Warehouse_Code,
  gb1.Period_Start,
  gb1.country,
  tm.c445_month,
  tm.report_date,
  gb1.update_flag,               
  max(gb1.update_flag) over (partition by tm.yearmonth order by gb1.update_flag range between unbounded preceding and current row ) as update_window,
  SUM(gb1.TOTAL_NEW_SALES_FORECAST) AS dc_forecast
FROM BAS_E2E_OUTPUT_GLOBAL_FCST gb1
  inner join (
    SELECT
       gb2.SKU_Id,
       gb2.Warehouse_Code,
       gb2.Period_Start,
       gb2.country,
       gb2.update_flag,
       gb2.report_date,
       tm1.week_date,
       tm1.c445_month,
       tm1.yearmonth
   FROM BAS_E2E_OUTPUT_GLOBAL_FCST as gb2
     left join (
       select distinct(week_date) as week_date,
              c445_month, 
              yearmonth 
       from "PROD"."INV_PROD"."BAS_445_MONTH_ALIGNMENT" 
       group by c445_month, week_date, yearmonth 
     ) as tm1 on gb2.report_date = tm1.week_date
   group by SKU_Id,
            Warehouse_Code,
            Period_Start,
            country,
            update_flag,
            report_date,
            tm1.week_date,
            tm1.c445_month,
            tm1.yearmonth
  ) as tm 
     on gb1.report_date = tm.week_date
    and  gb1.SKU_ID = tm.sku_id
    and gb1.Warehouse_Code = tm.warehouse_code
    and gb1.Period_Start  = tm.period_start
    and gb1.country = tm.country
GROUP BY
    gb1.SKU_Id,
    gb1.Warehouse_Code,
    gb1.Period_Start,
    gb1.country,
    tm.c445_month,
    tm.yearmonth,
    tm.report_date,
    gb1.update_flag

1 Ответ

0 голосов
/ 07 ноября 2019

В настоящее время вы используете MAX, при этом окно определяется как каждая предыдущая строка, включая текущую. Следовательно, по праву максимальное значение, которое он возвращает, вероятно, должно меняться для каждой записи. Возможно, вы хотели взять максимум над фиксированным разделом:

MAX(gb1.update_flag) OVER (PARTITION BY tm.yearmonth) AS update_window

Кстати, если вы сделали действительно намереваетесь использовать MAX с вашей текущей оконной логикой, в большинстве версийSQL предложение ORDER BY можно упростить до:

MAX(gb1.update_flag) OVER (PARTITION BY tm.yearmonth ORDER BY gb1.update_flag) AS update_window

То есть диапазон по умолчанию неограничен перед текущей строкой, поэтому говорить об этом не обязательно.

...