根据组中的最小和最大日期创建日期范围



我有一个如下格式的表:这里的日期是相同的,但在我的实际数据中它们不同。

+----------------------------------+-----+
|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以计算该范围的所有日期。

最新更新