Google bigquery Google BigQuery:从天表中获取一个包含一年中所有天的表

Google bigquery Google BigQuery:从天表中获取一个包含一年中所有天的表,google-bigquery,cartesian-product,cross-join,Google Bigquery,Cartesian Product,Cross Join,我有这个(样本)表格: 我需要创建所有(日期+用户)夫妻的完整排列,以填充2019年所有缺失的日子(使用属性作为null) 在我的示例中,我有两个不同的用户: user1@example.com user2@example.com 结果表应为: +------------+-------------------+-----------+ | Date | User | Attribute | +------------+-----------------

我有这个(样本)表格:

我需要创建所有(日期+用户)夫妻的完整排列,以填充2019年所有缺失的日子(使用
属性
作为
null

在我的示例中,我有两个不同的用户:

  • user1@example.com
  • user2@example.com
结果表应为:

+------------+-------------------+-----------+
|    Date    |       User        | Attribute |
+------------+-------------------+-----------+
| 2019-01-01 | user1@example.com | apple     |
| ...        | user1@example.com | null      |
| 2019-03-01 | user1@example.com | carrot    |
| ...        | user1@example.com | null      |
| 2019-12-31 | user1@example.com | null      |
| 2019-01-01 | user2@example.com | null      |
| ...        | user2@example.com | null      |
| 2019-02-01 | user2@example.com | pear      |
| ...        | user2@example.com | null      |
| 2019-03-01 | user2@example.com | orange    |
| ...        | user2@example.com | null      |
| 2019-12-31 | user2@example.com | null      |
+------------+-------------------+-----------+
表示一年中的每一天都有一行,
属性
在源表提供实际值时有一个值,否则使用
null

作为第一步,要创建所有(日期+用户)排列,我考虑使用
bigquery public data.utility\u eu.date\u greg
表,使用
交叉连接创建所有需要的行

下面是要使用的示例表:

#standardSQL
WITH sample AS (
  SELECT DATE('2019-01-01') date, 'user1@example.com' user, 'apple' attribute
  UNION ALL
  SELECT DATE('2019-02-01'), 'user2@example.com', 'pear'
  UNION ALL
  SELECT DATE('2019-03-01'), 'user1@example.com', 'carrot'
  UNION ALL
  SELECT DATE('2019-03-01'), 'user2@example.com', 'orange'
)
这里是我尝试的第一个查询:

SELECT d.date,s.* EXCEPT(date)
FROM sample s
  CROSS JOIN `bigquery-public-data.utility_eu.date_greg` d 
WHERE d.year = 2019
ORDER BY date,user
但是这太多了,因为在连接中使用了
属性
值,并且我将在所有与原始值无关的日期复制该值

我想我需要有某种不同的
属性
,以便只获得唯一的(日期+用户)情侣,然后才关联
属性
值(如果有的话)

这是我发现的第一个有效解决方案:

distinct_couples AS (
  SELECT DISTINCT d.date,s.user
  FROM sample s CROSS JOIN `bigquery-public-data.utility_eu.date_greg` d 
  WHERE d.year = 2019
)

SELECT d.*, s.attribute
FROM distinct_couples d
  LEFT JOIN sample s USING(date,user)
ORDER BY date,user
但我对
sample
进行了两次连接(第一次在temp表中,第二次在主查询中),所以我试图了解是否可以进行优化

你对如何使它工作有什么建议吗?
感谢下面是BigQuery标准SQL

#standardSQL
WITH users AS (
  SELECT DISTINCT user
  FROM `project.dataset.sample`
)
SELECT d.date, u.user, s.attribute
FROM `bigquery-public-data.utility_eu.date_greg` d  
CROSS JOIN users u
LEFT JOIN `project.dataset.sample` s
ON s.date = d.date
AND s.user = u.user
WHERE d.year = 2019
作为一个旁注-您实际上不需要使用任何额外的日期表,因为您可以动态生成它-如下例所示

#standardSQL
WITH users AS (
  SELECT DISTINCT user
  FROM `project.dataset.sample`
), dates AS (
  SELECT `date` 
  FROM UNNEST(GENERATE_DATE_ARRAY('2019-01-01', '2019-12-31')) `date`
)
SELECT d.date, u.user, s.attribute
FROM dates d  
CROSS JOIN users u
LEFT JOIN `project.dataset.sample` s
ON s.date = d.date
AND s.user = u.user

下面是BigQuery标准SQL

#standardSQL
WITH users AS (
  SELECT DISTINCT user
  FROM `project.dataset.sample`
)
SELECT d.date, u.user, s.attribute
FROM `bigquery-public-data.utility_eu.date_greg` d  
CROSS JOIN users u
LEFT JOIN `project.dataset.sample` s
ON s.date = d.date
AND s.user = u.user
WHERE d.year = 2019
作为一个旁注-您实际上不需要使用任何额外的日期表,因为您可以动态生成它-如下例所示

#standardSQL
WITH users AS (
  SELECT DISTINCT user
  FROM `project.dataset.sample`
), dates AS (
  SELECT `date` 
  FROM UNNEST(GENERATE_DATE_ARRAY('2019-01-01', '2019-12-31')) `date`
)
SELECT d.date, u.user, s.attribute
FROM dates d  
CROSS JOIN users u
LEFT JOIN `project.dataset.sample` s
ON s.date = d.date
AND s.user = u.user

谢谢,我不知道
生成日期数组
谢谢,我不知道
生成日期数组