2017-10-25 15 views
0

オラクル版11gオラクル:過去30営業日の平均件数を取得

私のテーブルには、これらと同様のレコードがあります。

calendar_date ID record_count 
25-OCT-2017  1 20 
25-OCT-2017  2 40 
25-OCT-2017  3 60 
24-OCT-2017  1 70 
24-OCT-2017  2 50 
24-OCT-2017  3 10 
20-OCT-2017  1 35 
20-OCT-2017  2 60 
20-OCT-2017  3 90 
18-OCT-2017  1 80 
18-OCT-2017  2 50 
18-OCT-2017  3 45 

つまり、それぞれIDの場合、指定された暦日に1レコードカウントがあります。日はではなくです。つまり、週末/休日などのレコードが不足している可能性があります。その日には、IDに使用できるレコードはありません。しかし、就業日には、各IDに対応するエントリーがあります。

私は、このような出力をしたい各ID

のために最後の30 business daysの平均レコード数を取得する必要があり

ID avg_count_last_30 
1 150 
2 130 
3 110 

私はこれを行う最も効率的な方法を見つけようとしています。私はRANGE BETWEENROWS BETWEENなどを使用することを考えましたが、それはうまくいくでしょう。

もちろん、このようなクエリは間に休暇があるので役に立ちません。私は必要なもの

select id, AVG(record_count) FROM mytable 
where calendar_date between SYSDATE - 30 and SYSDATE - 1 
group by id; 

は、私が30

last_business_day直近営業日になります数えるまで

select id , AVG(record_count) FROM mytable 
    where calendar_date between last_30th_business_day and last_business_day 
    group by id; 

last_30th_business_dayのようなものが後方に行く直近営業日から始まるcount(DISTINCT business_days)になりますです

専門家の意見を知りたいですか?これと最善のアプローチ。あなたのコメントに基づいて

+0

どのように休日の日付を得るのですか?週末を除いてはそれほど難しくはありませんが、祝日を含むテーブルが参考に必要です。 –

+0

特定のカレンダー駆動アプローチについて詳しく知りたい。 Holidayテーブルを作成し、クエリで使用する必要があります。 – XING

+0

各営業日に** 1 **レコードがありますか? –

答えて

1

は、このいずれかを試してみてください。

WITH mytable (calendar_date, ID, record_count) AS (
    SELECT TO_DATE('25-10-2017', 'DD-MM-YYYY'), 1, 20 FROM dual UNION ALL 
    SELECT TO_DATE('25-10-2017', 'DD-MM-YYYY'), 2, 40 FROM dual UNION ALL 
    SELECT TO_DATE('25-10-2017', 'DD-MM-YYYY'), 3, 60 FROM dual UNION ALL 
    SELECT TO_DATE('24-10-2017', 'DD-MM-YYYY'), 1, 70 FROM dual UNION ALL 
    SELECT TO_DATE('24-10-2017', 'DD-MM-YYYY'), 2, 50 FROM dual UNION ALL 
    SELECT TO_DATE('24-10-2017', 'DD-MM-YYYY'), 3, 10 FROM dual UNION ALL 
    SELECT TO_DATE('20-10-2017', 'DD-MM-YYYY'), 1, 35 FROM dual UNION ALL 
    SELECT TO_DATE('20-10-2017', 'DD-MM-YYYY'), 2, 60 FROM dual UNION ALL 
    SELECT TO_DATE('20-10-2017', 'DD-MM-YYYY'), 3, 90 FROM dual UNION ALL 
    SELECT TO_DATE('18-10-2017', 'DD-MM-YYYY'), 1, 80 FROM dual UNION ALL 
    SELECT TO_DATE('18-10-2017', 'DD-MM-YYYY'), 2, 50 FROM dual UNION ALL 
    SELECT TO_DATE('18-10-2017', 'DD-MM-YYYY'), 3, 45 FROM dual), 
t AS (
    SELECT calendar_date, ID, record_count, 
     ROW_NUMBER() OVER (PARTITION BY ID ORDER BY calendar_date desc) AS RN 
    FROM mytable) 
SELECT ID, AVG(RECORD_COUNT) 
FROM t 
WHERE rn <= 30 
group by ID; 
+0

私はこれを試してみる必要があります。実際にはこれは、他のいくつかの計算がある大規模なクエリのコンポーネントです。彼らがどのように一緒に働くか見てみましょう。 –

+0

ありがとうございました。レコードが30日未満で利用可能な場合でも、これは機能します。 –

関連する問題