2016-08-08 6 views
0

ケースがあり、それらのケースに対して顧客に対して複数の呼び出しが行われるシナリオがあります。これらのすべてのコールログには、次の列を持つテーブルである - 最後の7日間のケースの最初の呼び出しを見つけよう

id primary key int 
case_id int 
call_made_at timestamp 

は、私は新しいコールの数最後の7日間、古い呼の数(任意の呼び出しで作られた(いずれのケースのために作られた第一の呼び出し)を見つけるために持っています過去7日間に1回目の電話ではありません)。

私はrow_number()をcase_idより大きいパーティションで使用できます。しかし、ケースIDの生涯はあまりありません。だから、テーブル全体をパーティション化するのは悪いようです。また、テーブルもすぐに巨大になります。

提案がありますか?

答えて

1

私が集約ではなく、ウィンドウ関数としてこれを参照してください。

select sum(case when min_cma >= current_date - interval '7 day' then 1 else 0 end) as last_7_days, 
     sum(case when max_cma >= current_date - interval '7 day' and 
        min_cms < current_date - interval '7 day' 
       then 1 else 0 end) as 
from (select cl.case_id, 
      min(call_made_at) as min_cma, 
      max(call_made_at) as max_cma 
     from call_logs cl 
     group by cl.case_id 
    ) cl; 

あなたが外部クエリにwhere max_cma >= current_date - interval '7 day'のようなものを追加することができます。おそらくパフォーマンスが向上します。

+0

これは、最近7日間に行われた新旧の通話をどのようにカウントするかわかりません。 @SiddharthPrakashSingh。 –

+0

。 。これは、過去7日間に最初の通話が行われた件数をカウントします。それはあなたが求めているようです(最初のコラムのために)。 –

+0

私は、過去7日間に行った新しい電話番号と古い電話番号を取得したかったのです。 –

関連する問題