使用 over 函数的 Spotfire 日期差异

Spotfire date difference using over function

我有以下数据集:

Item  ||  Date       || Client ID || Date difference
A     ||  12/12/2014 || 102       || 
A     ||  13/12/2014 || 102       || 1
B     ||  12/12/2014 || 141       || 
B     ||  17/12/2014 || 141       || 5

我想计算客户端ID相同时两个日期之间的年差。我可以在计算列中使用什么表达式来获取该值?

更新

这将是计算出的预期值。我的 table 有大约 300,000 条记录,没有特别的顺序。在使用这个公式之前,我是否必须对物理 table 进行排序?我使用了另一个我发现的例子,我的实际文件没有项目列。它只是客户 ID 和交易日期。再次感谢您的帮助!

ClientId    Date        Days
 102         2014.12.12  0
 102         2014.12.13  1
 141         2014.12.12  0
 141         2014.12.17  5
 123         2014.12.01  0
 123         2014.12.02  1
 123         2014.12.04  2

编辑 2015.07.15

知道了,所以如果您想要与上一个客户日期对有所不同。此表达式将为您提供上面列出的 table。可读性间距:

DateDiff('day',
  First([Date) OVER (Intersect([ClientId], Previous([Date]))),
  [Date]
)


编辑 2015.07.13

如果你想减少这个以便你可以准确地聚合 [Days],你可以用 If() 包围上面的表达式。我将添加一些间距以使其更具可读性:

If(
    [Date] = Min([Date]) OVER Intersect([ClientId], [Item]), 
    DateDiff( 'day', 
        Min([Date]) OVER Intersect([ClientId], [Item]), 
        Max([Date]) OVER Intersect([ClientId], [Item])
    )
    , 0
)

英文:"If the value of the [Date] column in this row matches the earliest date for this [ItemId] and [ClientId] combination, then put the number of days difference between the first and last [Date] for this [ItemId] and [ClientId] combination; otherwise, put zero."

结果如下:

Item    ClientId    Date        Days
A       102         2014.12.12  1
A       102         2014.12.13  0
B       141         2014.12.12  5
B       141         2014.12.17  0
C       123         2014.12.01  2
C       123         2014.12.02  0
C       123         2014.12.03  0

警告过滤器可能会破坏此计算。例如,如果您根据 [Date] 进行筛选,并以上述 table 为例,筛选出 2014.12.13 之前的所有日期,Sum([Date]) 将是 7 而不是 8(因为第一行已被过滤掉)。


您可以使用 Spotfire 的 OVER 函数来查看具有跨行公共 ID 的数据点。

您似乎每个客户 ID 和商品 ID 只有两行,这对我们很有帮助!使用以下公式:

DateDiff('day', Min([Date]) OVER Intersect([ClientId], [Item]), Max([Date]) OVER Intersect([ClientId], [Item]))

这将为您提供一个列,其中包含每行中两个日期之间相差的天数:

Item    ClientId    Date        Days
A       102         2014.12.12  1
A       102         2014.12.13  1
B       141         2014.12.12  5
B       141         2014.12.17  5

我使用以下解决方案来处理超过 2 个 rows/dates 的组。

首先创建一个计算列以提供每个组内按日期排序的顺序:

RankDatePerUnit:

  Rank([EventDate],[Group_Name])

然后另一个计算列使用过度表达式来引用组内的前一个日期来执行日期差异。

TimeSinceLastEvent:

DateDiff("day",
   First([EventDate]) OVER (Intersect([Group_Name], Previous([RankDatePerUnit]))),
   [EventDate])

注意:使用 denserank 可以以不同方式处理重复日期。上述方法不会计算同一组中具有重复时间的两行之间的零日期差异。如果存在的话,他们都会从同一组中较早的日期开始计算他们的增量。