2017-04-19 9 views
1

背景:さまざまな量の材料の価格を設定するために頻繁に更新される範囲があります。一定のクォータが満たされると、価格が下げられます。問題は、範囲が更新または追加された後の現在の価格を特定することです。オーバーラップしない範囲へのフィルタリング - Amazon RedShift

データセットから非連続範囲を除外することを検討しています。ここではいくつかのテストコードは次のとおりです。

drop table if exists public.test_ranges; 
create table public.test_ranges (
    category  integer 
    ,lower_bound integer 
    ,upper_bound integer 
    ,cost   numeric(10,2) 
    ,modifieddate timestamp 
); 

insert into public.test_ranges values (1,0,70456,0,'2015-09-29'); 
insert into public.test_ranges values (1,53956,60000,1.28,'2015-02-11'); 
insert into public.test_ranges values (1,70456,90000,1.02,'2015-09-29'); 
insert into public.test_ranges values (1,90000,120000,0.88,'2015-02-11'); 
insert into public.test_ranges values (1,120000,999999999,0.79,'2015-02-11'); 

insert into public.test_ranges values (2,0,48786,0,'2015-11-02'); 
insert into public.test_ranges values (2,22500,25000,0.43,'2015-02-17'); 
insert into public.test_ranges values (2,48786,50000,0.37,'2015-11-02'); 
insert into public.test_ranges values (2,50000,100000,0.21,'2015-02-17'); 
insert into public.test_ranges values (2,100000,175000,0.19,'2015-02-17'); 
insert into public.test_ranges values (2,175000,999999999,0.17,'2015-02-17'); 

insert into public.test_ranges values (3,0,585969,0,'2015-11-02'); 
insert into public.test_ranges values (3,346667,375000,0.15,'2014-09-12'); 
insert into public.test_ranges values (3,375000,500000,0.14,'2014-09-12'); 
insert into public.test_ranges values (3,500000,600000,0.13,'2014-09-12'); 
insert into public.test_ranges values (3,585969,999999999,0.02,'2015-11-02'); 
insert into public.test_ranges values (3,600000,670000,0.12,'2014-09-12'); 

select * from public.test_ranges order by 1,2; 

このコードが返す:

category lower_bound upper_bound cost modifieddate 
-------------------------------------------------- 
1   0   70456  0  2015-09-29 
1   53956  60000  1.28 2015-02-11 
1   70456  90000  1.02 2015-09-29 
1   90000  120000  0.88 2015-02-11 
1   120000  999999999 0.79 2015-02-11 
2   0   48786  0  2015-11-02 
2   22500  25000  0.43 2015-02-17 
2   48786  50000  0.37 2015-11-02 
2   50000  100000  0.21 2015-02-17 
2   100000  175000  0.19 2015-02-17 
2   175000  999999999 0.17 2015-02-17 
3   0   585969  0.00 2015-11-02 
3   346667  375000  0.15 2014-09-12 
3   375000  500000  0.14 2014-09-12 
3   500000  600000  0.13 2014-09-12 
3   585969  999999999 0.02 2015-11-02 
3   600000  670000  0.12 2014-09-12 

希望する結果:任意の助けを事前に

category lower_bound upper_bound cost modifieddate 
-------------------------------------------------- 
1   0   70456  0  2015-09-29 
1   70456  90000  1.02 2015-09-29 
1   90000  120000  0.88 2015-02-11 
1   120000  999999999 0.79 2015-02-11 
2   0   48786  0  2015-11-02 
2   48786  50000  0.37 2015-11-02 
2   50000  100000  0.21 2015-02-17 
2   100000  175000  0.19 2015-02-17 
2   175000  999999999 0.17 2015-02-17 
3   0   585969  0.00 2015-11-02 
3   585969  999999999 0.02 2015-11-02 

感謝。

+0

赤方偏移かのPostgres:

部分的な解決策は、(あなたにカテゴリ3のために正しい結果を与えることはありませんか)? –

+0

レッドシフト........ – Josh

+0

要件を明確にしてください。他の行に完全に含まれている行を表示しないでください。行間に部分的な重なりがある場合(たとえば1-10と5-15)にはどうなりますか?さらに、upper_boundの値が範囲に含まれていないと仮定します(「以下」ではなく「未満」)。 –

答えて

0

再帰的な共通テーブル式なしでは完全に行うことはできません。現在、Redshiftではサポートされていません。

select tr1.* 
from public.test_ranges tr1 
    left join public.test_ranges tr_left on tr1.category = tr_left.category and tr1.lower_bound = tr_left.upper_bound 
    left join public.test_ranges tr_right on tr1.category = tr_right.category and tr_right.lower_bound = tr1.upper_bound 
where tr1.lower_bound = 0 or tr1.upper_bound = 999999999 or (tr_left.upper_bound is not null and tr_right.lower_bound is not null) 
order by tr1.category, tr1.lower_bound; 
関連する問題