当前位置: 首页 > 面试题库 >

重复的记录组可填补Google BigQuery中的多个日期空白

董喜
2023-03-14
问题内容

我发现了一个类似的问题(重复记录以填补Google
BigQuery中日期之间的空白
),但是存在不同的情况,答案不适用。

我的数据结构如下(基本上是多个产品和合作伙伴的价格变动历史记录):

+------------+---------+---------+-------+
|    date    | product | partner | value |
+------------+---------+---------+-------+
| 2017-01-01 | a       | x       |    10 |
| 2017-01-01 | b       | x       |    15 |
| 2017-01-01 | a       | y       |    11 |
| 2017-01-01 | b       | y       |    16 |
| 2017-01-05 | b       | x       |    13 |
| 2017-01-07 | a       | y       |    15 |
| 2017-01-07 | a       | x       |    15 |
+------------+---------+---------+-------+

我需要的是一个查询(特别是用BigQuery Standard
SQL编写),该查询在给定日期范围(在这种情况下2017-01-012017-01-10)下输出以下结果:

+--------------+---------+---------+-------+
|      date    | product | partner | value |
+--------------+---------+---------+-------+
|   2017-01-01 | a       | x       |    10 |
|   2017-01-02 | a       | x       |    10 |
|   2017-01-03 | a       | x       |    10 |
|   2017-01-04 | a       | x       |    10 |
|   2017-01-05 | a       | x       |    10 |
|   2017-01-06 | a       | x       |    10 |
|   2017-01-07 | a       | x       |    15 |
|   2017-01-08 | a       | x       |    15 |
|   2017-01-09 | a       | x       |    15 |
|   2017-01-10 | a       | x       |    15 |
|   2017-01-01 | a       | y       |    11 |
|   2017-01-02 | a       | y       |    11 |
|   2017-01-03 | a       | y       |    11 |
|   2017-01-04 | a       | y       |    11 |
|   2017-01-05 | a       | y       |    11 |
|   2017-01-06 | a       | y       |    11 |
|   2017-01-07 | a       | y       |    15 |
|   2017-01-08 | a       | y       |    15 |
|   2017-01-09 | a       | y       |    15 |
|   2017-01-10 | a       | y       |    15 |
|   2017-01-01 | b       | x       |    15 |
|   2017-01-02 | b       | x       |    15 |
|   2017-01-03 | b       | x       |    15 |
|   2017-01-04 | b       | x       |    15 |
|   2017-01-05 | b       | x       |    13 |
|   2017-01-06 | b       | x       |    13 |
|   2017-01-07 | b       | x       |    13 |
|   2017-01-08 | b       | x       |    13 |
|   2017-01-09 | b       | x       |    13 |
|   2017-01-10 | b       | x       |    13 |
|   2017-01-01 | b       | y       |    16 |
|   2017-01-02 | b       | y       |    16 |
|   2017-01-03 | b       | y       |    16 |
|   2017-01-04 | b       | y       |    16 |
|   2017-01-05 | b       | y       |    16 |
|   2017-01-06 | b       | y       |    16 |
|   2017-01-07 | b       | y       |    16 |
|   2017-01-08 | b       | y       |    16 |
|   2017-01-09 | b       | y       |    16 |
|   2017-01-10 | b       | y       |    16 |
+--------------+---------+---------+-------+

对于产品和合作伙伴的每种组合,基本上都是价格历史记录,其中包含所有日期差。

我很难弄清楚如何完成这项工作,尤其是如何在同一天没有价格变动的情况下生成多行。有任何想法吗?


问题答案:

尝试下面

#standardSQL
WITH history AS (
  SELECT '2017-01-01' AS d, 'a' AS product, 'x' AS partner, 10 AS value UNION ALL
  SELECT '2017-01-01' AS d, 'b' AS product, 'x' AS partner, 15 AS value UNION ALL
  SELECT '2017-01-01' AS d, 'a' AS product, 'y' AS partner, 11 AS value UNION ALL
  SELECT '2017-01-01' AS d, 'b' AS product, 'y' AS partner, 16 AS value UNION ALL
  SELECT '2017-01-05' AS d, 'b' AS product, 'x' AS partner, 13 AS value UNION ALL
  SELECT '2017-01-07' AS d, 'a' AS product, 'y' AS partner, 15 AS value UNION ALL
  SELECT '2017-01-07' AS d, 'a' AS product, 'x' AS partner, 15 AS value 
),
daterange AS (
  SELECT date_in_range  
  FROM UNNEST(GENERATE_DATE_ARRAY('2017-01-01', '2017-01-10')) AS date_in_range 
),
temp AS (
  SELECT d, product, partner, value, LEAD(d) OVER(PARTITION BY product, partner ORDER BY d) AS next_d
  FROM history
  ORDER BY product, partner, d
)
SELECT date_in_range, product, partner, value
FROM daterange
JOIN temp
ON daterange.date_in_range >= PARSE_DATE('%Y-%m-%d', temp.d) 
AND (daterange.date_in_range < PARSE_DATE('%Y-%m-%d', temp.next_d) OR temp.next_d IS NULL)
ORDER BY product, partner, date_in_range


 类似资料:
  • 问题内容: 我想修改一个熊猫MultiIndex DataFrame,以使每个索引组都包括指定范围之间的日期。我希望每个小组使用值0(或)填写缺少的日期2013-06-11至2013-12-31 。 我已经看到了有关ing的一些讨论,但这是针对简单(非分组)时间序列数据的。 是否有捷径可寻? 以下是我为实现此目的所做的一些尝试。例如:通过堆叠后,我便可以重新索引。 最后几行让我有些难过。我希望我可

  • 问题内容: 我有一个收藏。 产品浏览 我有一个查询,用于获取特定产品的每日视图。 询问 当前结果 问题 问题是,这种聚合不会在有视图的几天内返回。这会导致数据显示不正确: 结果应该看起来像 PS:最好输入开始和结束日期以基于此范围输出结果 问题答案: 您需要几个额外的步骤来返回默认值。首先,你需要使用与设置为收集所有结果中的一个文件内。然后,您可以将$ map 与一组天作为输入。在其中,您可以使用

  • 问题内容: 我有一个带有IDENTITY列的表 在添加/删除了beeing的某些行之后,我以Id值的间隔结尾: 有没有一种简单的方法可以将值压缩为 ? 问题答案: 我认为用相同的模式创建第二张表,从第一张表导入所有数据(当然,除了identity列;让第二张表开始重新编号),然后删除第一张表并将第二张表重命名为原始名称。 如果您有大量的FK关系要与其他表等一起重建,是否容易成为问题。

  • 问题内容: 我想获得表中每个记录的最小日期,该记录具有一个主键的多个日期条目。看看我的桌子: 我想要这样的结果: 我想获取每个CaseNo的最短日期记录在我的桌子上。 我尝试了这段代码: 结果是这样的: 该代码删除没有最小日期的行。我想显示所有记录的最小日期为Min_date。 问题答案: 试试这个

  • 问题内容: 这个问题已经在这里有了答案 : MySQL如何填充范围内的缺失日期? (5个答案) 2年前关闭。 我有这个查询,我想用一些值(例如零…)填充缺失的日期。 结果如下: 如何用零值填充缺失的日期?有人有主意吗? 我需要这些数据来进行 图表 预览。 问题答案: 通常,您可以使用以下方法在MySQL中生成一系列N个整数: 请注意,您联接的表(someTable)必须至少具有N行。 上面的-1是

  • 问题内容: 我有这个查询: 两个星期前在哪里,今天是今天。 我正在尝试查找特定日期范围内每天的所有点击。我也想包括没有点击的日子。由于我的数据库中自然没有这些条目,因此我需要向他们包括一些方法,如何最好地做到这一点,同时显示从开始日期到结束日期的所有日期。这是我目前所拥有的,这两个星期的日期范围有很多差距。 可以通过纯SQL查询完成此操作,还是必须使用某些php逻辑? 顺便说一句,为什么我有第一次