【问题标题】:Create rows of intermediary dates创建中间日期行
【发布时间】:2021-07-07 20:43:41
【问题描述】:

我希望使用历史数据获取在指定天数内每天结束时未分配的票证数量。我正在使用 Amazon Redshift。

查询当前具有以下结构:

ticket_id created_at assigned_at
1 2020-11-18 2020-11-20
2 2020-11-18 2020-11-18
3 2020-11-17 2020-11-20

我目前的策略是使用 created_at 日期,使用 created_date + 1 天创建一个新行,直到它与assigned_at 日期相同。从那里我可以轻松地使用 Tableau 操作输出。

我正在寻找的输出是:

ticket_id created_at assigned_at
1 2020-11-18 2020-11-20
1 2020-11-19 2020-11-20
1 2020-11-20 2020-11-20
2 2020-11-18 2020-11-18
3 2020-11-17 2020-11-20
3 2020-11-18 2020-11-20
3 2020-11-19 2020-11-20
3 2020-11-20 2020-11-20

最后我希望能够做到这一点:

date tickets in queue
2020-11-17 1
2020-11-18 2
2020-11-19 2
2020-11-20 0

我也愿意接受有关如何解决此问题的其他建议。

提前致谢!

【问题讨论】:

    标签: sql amazon-web-services amazon-redshift


    【解决方案1】:

    您可以使用日历创建一个附加表

    create table calendar (
        calendar_date date
    );
    
    calendar_date
    2020-11-17
    2020-11-18
    2020-11-19
    2020-11-20

    然后加入反对它

    select calendar_date, count(*) 
    from table_name as t 
        left join calendar as c on t.created_at <= c.calendar_date 
                                and c.calendar_date < t.assigned_at 
    where c.calendar_date <> t.assigned_at 
    group by 1
    order by 1;
    

    它给出以下输出

    calendar_date count
    2020-11-17 1
    2020-11-18 2
    2020-11-19 2

    2020-11-20 在此结果中不存在,因为没有票

    你可以通过稍微复杂的查询得到它

    with calendar_gr as (
        select calendar_date, 0 as cnt
        from calendar
    ),
    r1 as (
        select calendar_date, count(*)  
        from table_name as t 
            left join calendar as c on t.created_at <= c.calendar_date 
                                    and c.calendar_date < t.assigned_at                         
        where calendar_date <> assigned_at 
        group by 1
        order by 1
    )
    select calendar_gr.calendar_date, sum(coalesce(count, 0) + coalesce(cnt, 0)) 
    from r1
        right join calendar_gr on r1.calendar_date = calendar_gr.calendar_date
    group by 1
    ;
    
    
    calendar_date count
    2020-11-17 1
    2020-11-18 2
    2020-11-19 2
    2020-11-20 0

    【讨论】:

    • 此方法适用于中小型数据集并且表现良好。对于大多数情况,我会推荐一个沿着这些思路的解决方案。但是,如果数据集非常大并且 created_at 和 assign_at 之间的日期范围很宽,则此过程可能会创建大量中间数据记录。如果此中间数据​​大小超出内存,则查询会溢出并大幅减慢。这些情况有一些解决方案,但它们需要一些时间来布局。我可以写出这样的解决方案,但前提是相关用例遇到溢出问题。
    • 嗨,比尔,当我没有设置限制时,我遇到了 EOF 错误,所以我认为你是对的。正如我们将要做的那样,限制日期可以让我避免这种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    相关资源
    最近更新 更多