为另一列 Redshift 的每个值添加具有固定值的列

add column with fixed values for each value of another column Redshift

我关注table

]1

想要为每个用户添加日期范围

如何实现:

  1. 如果这可以通过 Redshift 中的查询实现,那将很有用

  2. 如果没有,在 python pandas 中创建它的有效方法是因为数据有 8lk 条记录

给定这个数据框 df:

   userid username
0       1        a
1       2        b
2       3        c

你可以使用 numpy repeat and tile:

dr = pd.date_range('2020-01-01','2020-01-03')
df = pd.DataFrame(np.repeat(df.to_numpy(), len(dr), 0), columns=df.columns).assign(date=np.tile(dr.to_numpy(), len(df)))

结果:

  userid username       date
0      1        a 2020-01-01
1      1        a 2020-01-02
2      1        a 2020-01-03
3      2        b 2020-01-01
4      2        b 2020-01-02
5      2        b 2020-01-03
6      3        c 2020-01-01
7      3        c 2020-01-02
8      3        c 2020-01-03

在 Sql 中,这也很简单 - 只需交叉连接要添加到每一行的日期列表(复制行)。您可以在您的示例中看到 3 行和 3 个日期导致 9 行。 (未经测试的解释代码:)

select userid, username, "date" from <table> cross join (select values ('2020-01-01'::date), ('2020-02-01'::date), ('2020-03-01'::date));

现在简单方法的问题是,如果您处理大表和长日期列表,乘法会杀死您。 100 亿行乘以 5,000 个日期是 15 万亿行的结果 - 这将花费很长时间并且存储它将占用大量磁盘 space。对于小型表格和简短的日期列表,这很好用。

如果您处于事物的“大”面,您可能需要重新考虑您正在尝试做的事情。由于您使用的是 Redshift,因此您可能需要这样做。