2012-02-08 4 views
0

Написание SQL-запроса, который должен возвращать средние расходы за предыдущее 91-дневное окно. Я усекаю дату до первого дня недели и ожидаю, что 91-дневный средний показатель составит 91 день до до этой даты.Oracle Analytic Preceded Возвращает неверные/непредвиденные результаты

Однако при проверке кажется, что средний показатель за 91 день включает в себя текущую неделю, которую я усекал.

Запрос:

SELECT 
    week AS WEEK, 
    to_char(week,'ww-yyyy') AS Week_num 
    --Sum of the charges for the previous 91 days/91 will give you avg charges per day for the last 91 days 
    --Need to count days regardless of if there are any charges on that day 
    ,(SUM(CHARGES) OVER (ORDER BY WEEK RANGE INTERVAL '91' DAY PRECEDING))/91 MV_91_DAY_AVG 
FROM 
( 

    SELECT 
     --Truncate date down to first of week. Goal is to make 91 day preceding being at this date. 
     TRUNC(TRANS.ORIG_POST_DATE,'WW') AS WEEK 
     ,SUM(TRANS.AMOUNT) AS CHARGES 
    FROM TRANS 
    WHERE 
     TRANS.DETAIL = "Charge" 
    GROUP BY TRUNC(TRANS.ORIG_POST_DATE,'WW') 
) 
ORDER BY WEEK 

Выход по току: enter image description here

+0

Если у вас есть вопрос, похожий на мой выше, я настоятельно рекомендую вам ознакомиться с этим обзором функций Oracle Analytic, которые можно найти на youtube на канале овечьей кожи, http://www.youtube.com/user/sheepsqueezersYT/search ? query = аналитический, или http://www.sheepsqueezers.com/. – Cimplicity

ответ

1

Я думаю, что вы хотите, чтобы ваше положение окна, чтобы быть:

(ORDER BY WEEK RANGE BETWEEN INTERVAL '91' DAY PRECEDING AND INTERVAL '1' DAY PRECEDING) 

для того, чтобы исключить обвинения текущей недели.

Вы также можете изменить «91» на «92», чтобы включить дополнительную неделю в начале.

+0

Блестящий это сделал трюк. Поэтому я должен признать, что до сих пор не понимаю, почему мой запрос захватывает текущую неделю и что заставляет вас исключать его. Если у вас есть минута, чтобы объяснить, что было бы здорово. Или не стесняйтесь указать мне какую-либо документацию, которую я должен рассмотреть. Я просто не уверен, где искать. В любом случае ... большое спасибо! – Cimplicity

+1

@ Простота: вы просто указали начальную точку диапазона. Конечная точка по умолчанию - это текущая строка, и она включена. Явным образом устанавливая конечную точку 'INTERVAL' 1' DAY PRECEDING', текущая строка исключается. –

0

Вычесть текущее значение перед делением?

,(SUM(CHARGES) OVER (ORDER BY WEEK RANGE INTERVAL '91' DAY PRECEDING) - CHARGES)/91 
+0

Я дал это попробовать, но не кубиками. Он полностью меняет числа. Прямо сейчас цифры верны, просто смещены на неделю. Спасибо за предложение, хотя ...;) – Cimplicity