在denodo中创建一个新的列/字段OVER id

时间:2017-05-19 15:44:24

标签: denodo

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

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

Expected Result

根据预期结果,我可以很容易地找到使用case语句的任何ID的提交和批准状态之间的差异,而对于当前结果,我无法做到。

谢谢,

1 个答案:

答案 0 :(得分:1)

我会尝试转动数据。以下是Denodo社区网站的链接,其中显示了如何执行此操作:

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

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

  

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

由于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中你可以创建这两个视图 - 一个使用上面的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

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