【问题标题】:Cross-product of date ranges日期范围的叉积
【发布时间】:2016-08-04 03:23:37
【问题描述】:

我有两个包含日期范围的表,我想以某种方式交叉相乘以获得所有不同的范围。也就是说,在其中一个表中具有边界的所有范围。

具体来说,我有一张表格,其中包含产品价格及其有效期以及带有有效期的转换因子。因此,我想要特定 price/conversion_factor 组合的每个实例以及它从何时到何时有效:

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            

因此,每次其中一个表到达新日期时,都应返回一个新行。在结果中,前两行引用了第一个产品行的有效性,但在 conversion_factos 表中分为两个区间。同样,结果的第二行和第三行来自第二个转换因子行,但产品行不同。

有没有办法通过巧妙的连接(在 PostgreSQL 中)来做到这一点,还是我需要使用 PL/pgSQL 函数?

【问题讨论】:

    标签: sql postgresql date join


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-07
      • 2010-11-26
      • 2012-09-24
      • 1970-01-01
      • 2018-03-05
      • 2020-10-16
      • 2015-08-06
      相关资源
      最近更新 更多