在 denodo 中创建一个新的 column/field OVER id

Creating a new column/field OVER id in denodo

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

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

Expected Result

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

谢谢,

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

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

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

id | status | create_dt
1 | submit   | 1/1/2017
1 | approve | 2/1/2017
1 | deliver   | 2/2/2017
2 | submit   | 1/1/2017
2 | approve | 1/10/2017
2 | deliver   | 2/1/2017
3 | submit   | 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 中,您可以制作这 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

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