如何提取 BigQuery 中两个时间戳之间的唯一日期?
How to extract unique days between two timestamps in BigQuery?
对于两个不同的时间戳,比方说时间戳('2015-02-01')和时间戳('2015-02-12'),我想要一个包含所有日期的列。像这样(12 行)
2015-02-01
2015-02-02
.
.
.
2015-02-12
您可以在 public 数据集 (fh-bigquery:geocode.numbers_65536
) 上使用交叉连接来做到这一点,其中您的数字最多为:65536
SELECT date(DATE_ADD(DAY, i, "DAY")) DAY
FROM
(SELECT '2015-01-01' AS DAY) a CROSS
JOIN
(SELECT i
FROM [fh-bigquery:geocode.numbers_65536]
WHERE i<=abs(DATEDIFF('2015-01-01','2015-01-15'))) b
ORDER BY DAY ASC
这输出:
+-----+------------+---+
| Row | day | |
+-----+------------+---+
| 1 | 2015-01-01 | |
| 2 | 2015-01-02 | |
| 3 | 2015-01-03 | |
| 4 | 2015-01-04 | |
| 5 | 2015-01-05 | |
| 6 | 2015-01-06 | |
| 7 | 2015-01-07 | |
| 8 | 2015-01-08 | |
| 9 | 2015-01-09 | |
| 10 | 2015-01-10 | |
| 11 | 2015-01-11 | |
| 12 | 2015-01-12 | |
| 13 | 2015-01-13 | |
| 14 | 2015-01-14 | |
| 15 | 2015-01-15 | |
+-----+------------+---+
您可以将此数据添加到 BigQuery UI 中的视图,方法是使用项目菜单 fh-bigquery
添加项目(项目名称旁边的下拉菜单,切换到项目 ➪ 显示项目)。或者,您可以导航到 BigQuery UI link https://bigquery.cloud.google.com/project/fh-bigquery
添加项目后,示例数据集 (fh-bigquery) 会出现在导航面板中。
@Pentium10 答案是正确且经典的填充范围的方法。只是为了好玩,我还想提供一个不依赖任何额外 table 的替代方案。这个解决方案是这样的:
- 使用 RPAD 生成所需长度的字符串,即间隔中的天数
- 使用 SPLIT 将其转换为元素数量等于间隔天数的重复字段
- 使用 POSITION 获取重复字段中每个元素的顺序索引
下面是整个查询:
select date(date_add(day, i, "DAY")) day
from (select '2015-01-01' day) a
cross join
(select
position(
split(
rpad('', datediff('2015-01-15','2015-01-01')*2, 'a,'))) i
from (select NULL)) b;
对于两个不同的时间戳,比方说时间戳('2015-02-01')和时间戳('2015-02-12'),我想要一个包含所有日期的列。像这样(12 行) 2015-02-01 2015-02-02 . . . 2015-02-12
您可以在 public 数据集 (fh-bigquery:geocode.numbers_65536
) 上使用交叉连接来做到这一点,其中您的数字最多为:65536
SELECT date(DATE_ADD(DAY, i, "DAY")) DAY
FROM
(SELECT '2015-01-01' AS DAY) a CROSS
JOIN
(SELECT i
FROM [fh-bigquery:geocode.numbers_65536]
WHERE i<=abs(DATEDIFF('2015-01-01','2015-01-15'))) b
ORDER BY DAY ASC
这输出:
+-----+------------+---+
| Row | day | |
+-----+------------+---+
| 1 | 2015-01-01 | |
| 2 | 2015-01-02 | |
| 3 | 2015-01-03 | |
| 4 | 2015-01-04 | |
| 5 | 2015-01-05 | |
| 6 | 2015-01-06 | |
| 7 | 2015-01-07 | |
| 8 | 2015-01-08 | |
| 9 | 2015-01-09 | |
| 10 | 2015-01-10 | |
| 11 | 2015-01-11 | |
| 12 | 2015-01-12 | |
| 13 | 2015-01-13 | |
| 14 | 2015-01-14 | |
| 15 | 2015-01-15 | |
+-----+------------+---+
您可以将此数据添加到 BigQuery UI 中的视图,方法是使用项目菜单 fh-bigquery
添加项目(项目名称旁边的下拉菜单,切换到项目 ➪ 显示项目)。或者,您可以导航到 BigQuery UI link https://bigquery.cloud.google.com/project/fh-bigquery
添加项目后,示例数据集 (fh-bigquery) 会出现在导航面板中。
@Pentium10 答案是正确且经典的填充范围的方法。只是为了好玩,我还想提供一个不依赖任何额外 table 的替代方案。这个解决方案是这样的:
- 使用 RPAD 生成所需长度的字符串,即间隔中的天数
- 使用 SPLIT 将其转换为元素数量等于间隔天数的重复字段
- 使用 POSITION 获取重复字段中每个元素的顺序索引
下面是整个查询:
select date(date_add(day, i, "DAY")) day
from (select '2015-01-01' day) a
cross join
(select
position(
split(
rpad('', datediff('2015-01-15','2015-01-01')*2, 'a,'))) i
from (select NULL)) b;