[英]create a date range based on min & max dates in a group
我有一个格式如下的表格:这里的日期是相同的,但在我的真实数据中它们不同。
+----------------------------------+-----+
|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))
我的 output 如下:
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 以计算该范围内的所有日期。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.