繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM