为另一列 Redshift 的每个值添加具有固定值的列
add column with fixed values for each value of another column Redshift
我关注table
]1
想要为每个用户添加日期范围
如何实现:
如果这可以通过 Redshift 中的查询实现,那将很有用
如果没有,在 python pandas 中创建它的有效方法是因为数据有 8lk 条记录
给定这个数据框 df
:
userid username
0 1 a
1 2 b
2 3 c
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,因此您可能需要这样做。
我关注table
想要为每个用户添加日期范围
如何实现:
如果这可以通过 Redshift 中的查询实现,那将很有用
如果没有,在 python pandas 中创建它的有效方法是因为数据有 8lk 条记录
给定这个数据框 df
:
userid username
0 1 a
1 2 b
2 3 c
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,因此您可能需要这样做。