2012-02-08 10 views
0

先行する91日間のウィンドウの平均料金を返すSQL問合せを作成します。私は週の最初の曜日に日付を切り捨て、91日の平均が91日にの前にこの日までになると期待しています。Oracle Analytic Preceding間違った予期しない結果を返します。

しかし、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

上記の鉱山に似た質問がある場合は、YouTubeのsheepsqueezersチャネル(http://www.youtube.com/user/sheepsqueezersYT/search)にあるOracle Analytic機能の概要を確認することを強くお勧めします。 ?query = analytic、またはhttp://www.sheepsqueezers.com/。 – Cimplicity

答えて

1

私はあなたの窓の句になりたいと思います。

「91」を「92」に変更して、先頭に1週間追加することもできます。

+0

これは巧妙なこれはトリックでした。だから私はまだ私のクエリが現在の週をつかんでいた理由とあなたのものがそれを除外する理由を理解していないことを認めなければなりません。もしそれが素晴らしいことを説明する分があれば。または、私が検討すべきいくつかの文書を私に指摘することを自由に感じてください。私はちょうどどこを見て静かではないです。いずれにせよ...多くのありがとう! – Cimplicity

+1

@Cimplicity:あなたが含める範囲の開始点を与えるだけでした。デフォルトのエンドポイントは現在の行であり、両端の値を含みます。明示的に 'INTERVAL' 1 'DAY PRECEDING'を設定することにより、現在の行は除外されます。 –

0

除前に、現在の値を引き?

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

現在の週の電荷を排除するために:

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

私はこれを試したが、サイコロを与えなかった。それは数を完全に変更します。今のところ、数字は一週間だけずれています。しかし、提案ありがとう...;) – Cimplicity

関連する問題