连接两个具有有效性区间的表

问题描述 投票:0回答:1

我有两张表:一张包含有关产品及其售价的信息

article_id  sell_price_at   validity_start_at      validity_end_at
advFUJKAx   2.99            2023-06-14T10:46:07    2024-02-15T00:59:59
advFUJKAx   2.99            2022-05-11T04:20:13    2023-06-14T10:46:07
advFUJKAx   2.99            2022-05-10T13:23:18    2022-05-11T04:20:13
advFUJKAx   2.99            2022-05-10T13:08:45    2022-05-10T13:23:18

另一则关于促销和促销价值的内容。促销在其生命周期内可能会发生变化,例如,我们认为促销太多,然后将促销更改为更少的内容。

article_id  promotion_id    promotion_value promotion_mechanism real_start_datetime real_end_datetime
advFUJKAx                                                       2023-06-27T23:59:59 2024-02-15T00:59:59
advFUJKAx   2GLCMltLyw      1.8             IMMEDIATE_DISCOUNT  2023-06-22T13:31:46 2023-06-27T23:59:59
advFUJKAx   2GLCMltLyw      2.49            IMMEDIATE_DISCOUNT  2023-06-19T08:58:40 2023-06-22T13:31:46
advFUJKAx   2GLCMltLyw      2.49            IMMEDIATE_DISCOUNT  2023-06-16T11:29:38 2023-06-19T08:58:40
advFUJKAx   2GLCMltLyw      2.49            IMMEDIATE_DISCOUNT  2023-06-14T15:05:31 2023-06-16T11:29:38
advFUJKAx                                                       2022-05-18T00:00:00 2023-06-13T00:00:00
advFUJKAx   -38_P0evh       2.29            IMMEDIATE_DISCOUNT  2022-05-11T05:03:04 2022-05-18T00:00:00
advFUJKAx   -38_P0evh       2.49            IMMEDIATE_DISCOUNT  2022-05-11T00:00:00 2022-05-11T05:03:04
advFUJKAx                                                       2022-05-10T13:08:45 2022-05-11T00:00:00

如您所见,对于促销,我已经填补了间隔中的“漏洞”,这意味着对于给定的文章,促销表中的相应行将始终共享最小开始日期和最大结束日期。另外,我在促销表的中间添加了空行,对应于没有促销活动的时间间隔。

我正在尝试加入这两个表,以便能够重新创建定价日期间隔,同时考虑到促销活动,以便我可以拥有我的

sell_price_at
列和一个新列:
sell_price_at_after_discount

我只是觉得这很简单,但我无法理解它。我尝试了连接两个表的不同方法,但似乎没有任何效果。

我正在研究 BigQuery,我不知道这是否有影响。

sql google-bigquery
1个回答
0
投票

要实现连接两个表并计算

sell_price_at_after_discount
并考虑促销的预期结果,您可以按照以下步骤操作:

  • Join
    article_id
    上的两个表,并根据重叠时间间隔进行筛选(productsvalidity_start_at
    validity_end_at
    promotionsreal_start_datetime
    real_end_datetime
    )。
  • 考虑促销价值,使用
    CASE
    语句计算 sell_price_at_after_discount
SELECT
  promo.article_id,
  promo.promotion_value,
  promo.real_start_datetime,
  promo.real_end_datetime,
  CASE
    WHEN promo.promotion_value IS NOT NULL THEN products.sell_price_at - promo.promotion_value
    ELSE products.sell_price_at
  END AS sell_price_at_after_discount
FROM
  `babynames.promotions_table` promo
JOIN (
  SELECT
  article_id,
  sell_price_at,
  validity_start_at,
  validity_end_at
FROM
  `babynames.products_table`
) products
ON
  products.article_id = promo.article_id
AND
  products.validity_start_at <= promo.real_start_datetime
AND
  products.validity_end_at >= promo.real_end_datetime

输出:

© www.soinside.com 2019 - 2024. All rights reserved.