【问题标题】:Creating a new column/field OVER id in denodo在denodo中创建一个新的列/字段OVER id
【发布时间】:2017-05-22 22:45:20
【问题描述】:

我想知道在计算各种状态的日期之间的差异方面是否可以得到一些帮助。 我有一个名为“id”、“create_dt”和“status”列的视图。我会有各种状态,如提交、批准、交付等。现在,我想找出特定 id 在 Approve 和 Submit 状态之间所花费的时间。我目前在想的是,根据状态创建几个额外的字段(我可以为此使用 case 语句),并找到新创建的各种状态的日期列之间的时间差异。 这里的问题是,我不确定如何根据特定的 id 来驱动计算。我不能做滞后或领先,因为有些“id”可能会经历不同的状态,有些可能不会(不一致)。 我无法根据 id(类似于 partition by)创建新的日期列,因为我使用的是 case 语句。 有人能指出我正确的方向吗?

下面是我的数据当前的样子(使用 case 语句)以及我想要的输出的屏幕截图。 Current Result

Expected Result

从预期结果中,我可以很容易地找到任何使用案例语句的 ID 的已提交状态和已批准状态之间的区别,而对于当前结果,我无法找到。

谢谢你,

【问题讨论】:

    标签: denodo


    【解决方案1】:

    我会尝试旋转数据。这是一个 Denodo 社区站点的链接,其中显示了如何执行此操作:

    https://community.denodo.com/kb/view/document/How%20to%20Pivot%20and%20Unpivot%20views?category=Combining+Data

    针对您的具体情况,我创建了一个小型 Excel 数据源来在我命名为“p_sample”的视图中模拟您的问题(使用简化的日期和状态名称):

    标识 |状态 | create_dt
    1 |提交  | 2017 年 1 月 1 日
    1 |批准 | 2017 年 2 月 1 日
    1 |交付   | 2017 年 2 月 2 日
    2 |提交  | 2017 年 1 月 1 日
    2 |批准 | 2017 年 1 月 10 日
    2 |交付   | 2017 年 2 月 1 日
    3 |提交  | 2017 年 1 月 1 日
    ....

    由于 Denodo 似乎不支持 PIVOT 运算符,因此我们可以使用以下 VQL 来调整您的状态日期,以便它们都在同一行:

    select id
      , max(case when status = 'submit' then create_dt end) as submit_dt
      , max(case when status = 'approve' then create_dt end) as approve_dt
      , max(case when status = 'deliver' then create_dt end) as deliver_dt
      , max(case when status = 'reject' then create_dt end) as reject_dt
      , max(case when status = 'other' then create_dt end) as other_dt
    from p_sample
    group by id
    

    然后我们可以将该查询用作内联视图来执行日期数学运算(或者在 Denodo 中,您可以创建这 2 个视图 - 一个使用上述 VQL,然后在应用日期数学的视图之上选择一个视图):

    select *, approve_dt - submit_dt as time_to_aprove
    from (
    select id
      , max(case when status = 'submit' then create_dt end) as submit_dt
      , max(case when status = 'approve' then create_dt end) as approve_dt
      , max(case when status = 'deliver' then create_dt end) as deliver_dt
      , max(case when status = 'reject' then create_dt end) as reject_dt
      , max(case when status = 'other' then create_dt end) as other_dt
    from p_sample
    group by id
    ) AS Pivot
    

    运行此程序时,您会获得 ID 的每个状态日期,以及提交和批准之间的时间。

    Query Results

    唯一的缺点是如果状态代码列表非常大或控制不好,那么这个解决方案将不够灵活,但你的例子似乎表明这不会是一个问题。

    【讨论】:

    • 谢谢,凯尔。我正在尝试您上面提到的 Denodo 链接,但它无法通过图形界面获得预期的结果。无论如何,我可以使用 VQL。欣赏!
    • 太棒了!我很高兴它有所帮助。
    • 随着上述问题的继续,连同上述信息(批准日期、提交日期和 ID),我还有一个名为“假期”的列。现在,我想找出批准日期和假期日期之间的区别,不包括假期。你能想出一个在 Denodo 中做到这一点的简单方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多