REDSHIFT:如何在不在 redshift (Postgres 8.0.2) 中创建名为 "numbers" 的 table 的情况下生成一系列数字?

REDSHIFT: How can I generate a series of numbers without creating a table called "numbers" in redshift (Postgres 8.0.2)?

我需要为报告创建一个空的时间 table 系列,这样我就可以从多个 table 中加入 activity 到它。一天中的每个小时不一定都有数据,但我希望它在 activity 中显示 null 或零,而不是省略一天中的那个小时。

在更高版本的 Postgres (post 8.0.2) 中,这在几个方面很容易:

SELECT unnest(array[0,1,2,3,4...]) as numbers

CROSS JOIN (select generate_series as hours from generate_series(now()::timestamp, now()::timestamp + interval '1 day', '1 hour'::interval )) date_series

Redshift 可以 运行 其中一些命令,但是当您尝试 运行 将其与任何 table 结合使用时会抛出错误。

我需要什么:

生成一系列数字(例如 0-23)的可靠方法作为子查询,将 运行 红移(使用 postgres 8.0.2).

遗憾的是,Amazon Redshift 不允许对 table 函数使用 generate_series()。解决方法似乎是创建 table 个数字。

另请参阅:

只要您的 table 行数多于所需系列的数量,这就是过去对我有用的方法:

select
    (row_number() over (order by 1)) - 1 as hour
from
    large_table
limit 24
;

returns 个数字 0-23

我不太喜欢查询系统 table 只是为了获取行号列表。如果它像一天中的几个小时一样恒定且足够小,我会选择普通的 UNION ALL:

WITH 
  hours_in_day AS (
    SELECT 0 AS hour
    UNION ALL SELECT 1
    UNION ALL SELECT 2
    UNION ALL SELECT 3
    UNION ALL SELECT 4
    ...
    UNION ALL SELECT 23
  )

然后加入hours_in_day任何你想加入的。

Recursion was released for Redshift in April 2021. 现在在 Redshift 中递归是可能的。您可以使用以下代码生成一系列数字(甚至 table)

with recursive numbers(NUMBER) as
(
select 1 UNION ALL
select NUMBER + 1 from numbers where NUMBER < 28
)