2016-04-13 19 views
1

私は、すべての明確な範囲を得るために交差する日付範囲を含む2つのテーブルを持っています。つまり、テーブルの1つに境界線を持つすべての範囲です。日付範囲の外積

具体的には、製品価格と有効期限のテーブル、および有効期限のある変換係数があります。私は、結果として、特定の価格/ CONVERSION_FACTORの組み合わせの各インスタンスをしたいとしてから、それが有効であったときに:だからテーブルのたびに1が新しい日付に当たる

products: 
product_id start_date end_date price_eur 
1   2000-01-01 2000-12-31 100 
1   2001-01-01 2002-12-31 150 


conversion_factors: 
start_date end_date dollar_to_eur 
1970-01-01 2000-03-31 1.50 
2000-04-01 2000-06-30 1.60 
2000-07-01 2001-06-30 1.70 
2001-07-01 2003-06-30 2.00 

result: 
product_id start_date end_date price_eur dollar_to_eur 
1   2000-01-01 2000-03-31 100   1.50     
1   2000-04-01 2000-06-30 100   1.60     
1   2000-07-01 2000-12-31 100   1.70     
1   2001-01-01 2001-06-30 150   1.70     
1   2001-07-01 2002-12-31 150   2.00    

、新しい行が返されます。その結果、最初の2行は最初の製品行の有効性を参照しますが、conversion_factos表では2つの間隔に分割されます。同様に、結果の第2および第3の行は、第2の変換係数行から来るが、製品行が異なる。

これを賢明な結合(PostgreSQL)で行う方法はありますか、またはPL/pgSQL関数を使用する必要がありますか?

答えて

1

これには、スマートな結合を求めて、正しい結果を表示するよう求めている部分があります。これはあなたの問題に答えるはずです:

SELECT Greatest(p.start_date, cf.start_date) AS start_date 
     ,Least(p.end_date, cf.end_date) AS end_date 
     ,p.price_eur 
     ,cf.dollar_to_eur 
FROM products AS p 
    JOIN conversion_factors AS cf 
    ON p.start_date <= cf.end_date AND p.end_date >= cf.start_date