我有一个如下格式的表:这里的日期是相同的,但在我的实际数据中它们不同。
+----------------------------------+-----+
|DATE_AGG |USER |
+----------------------------------+-----+
|[ |Julia|
|"2010-01-01", | |
|"2022-08-23" | |
|] | |
|[ |Jon |
|"2010-01-01", | |
|"2022-08-23" | |
|] | |
|[ |Amina|
|"2010-01-01", | |
|"2022-08-23" | |
|] | |
+----------------------------------+-----+
SELECT ARRAY_CONSTRUCT(dt_from, dt_to) as date_agg, user
FROM (
VALUES
('2010-01-01', '2022-08-23', 'Julia'),
('2010-01-01', '2022-08-23', 'Jon'),
('2010-01-01', '2022-08-23', 'Amina')
) t(dt_from, dt_to, user)
我想";爆炸/未爆炸";将date_agg
列转换为每个User
的日期范围
我知道如何对单个范围执行此操作,但我想知道是否有一种方法可以在SQL中执行此操作?(我懒惰的大脑正在寻找Python中的UDF…!(
SELECT DATEADD(DAY, '-' || ROW_NUMBER() OVER (ORDER BY NULL)
, DATEADD(DAY, +1, CURRENT_DATE())
) AS dt
FROM TABLE (GENERATOR(ROWCOUNT => 9999))
我的输出如下:
date user
0 2010-01-01 Amina
1 2010-01-02 Amina
2 2010-01-03 Amina
3 2010-01-04 Amina
4 2010-01-05 Amina
... ... ...
4613 2022-08-19 Julia
4614 2022-08-20 Julia
4615 2022-08-21 Julia
4616 2022-08-22 Julia
4617 2022-08-23 Julia
这里有一种方法
with cte as
(select user,
get(date_agg,0)::date as start_date,
datediff(day,get(date_agg,0)::date,get(date_agg,1)::date) as day_count
from t)
select user, dateadd('day',b.index-1,start_date) as dates
from cte a, lateral split_to_table(repeat('.',day_count), '.') b
其想法是计算每个用户的开始日期和结束日期之间的天数范围(N(。然后,通过生成长度为N的字符串并将其拆分为行,可以为每个用户创建尽可能多的行。当拆分为行时,您将有一个来自split_to_table
的索引列,可以将其添加到start_date以计算该范围的所有日期。