【问题标题】:Spotfire date difference using over function使用过函数的 Spotfire 日期差异
【发布时间】:2015-07-10 15:28:50
【问题描述】:

我有以下数据集:

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 相同时,我想计算两个日期之间的年差。我可以在计算列中使用什么表达式来获取该值?

更新

你好

这将是计算的预期值。我的表有大约 300,000 条记录,没有特定的顺序。在使用此公式之前,我是否必须对物理表进行排序?我使用了另一个我发现的示例,我的实际文件没有项目列。它只是客户 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

【问题讨论】:

  • 您的意思是天数而不是年数?

标签: analytics spotfire


【解决方案1】:

编辑 2015.07.15

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

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
)

英文:“如果此行中[Date]列的值与此[ItemId]和[ClientId]组合的最早日期匹配,则将第一个和最后一个[Date]之间的天数差为此 [ItemId] 和 [ClientId] 组合;否则,置零。”

结果如下:

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] 进行过滤,并且以上表为例,过滤掉 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 个项目但有些客户有更多项目的情况。例如,我正在查看客户有 3 条记录的情况,此公式将使用最早和最晚日期进行计算。在这些情况下,最早的项目应该有值 0,中间记录(middle date-earliest date),最近的记录(most recent-middle record)。有没有办法获得这些值?再次感谢您的帮助!
  • 如果我的编辑不能解决您的问题,您能描述一下您预期的最终结果吗?
  • 谢谢尼科!我在计算列中尝试了该表达式。 [Column2] 值是多少?我尝试用客户 ID 和交易日期替换它,但在这两种情况下,该列都出现了空白值。 ——
  • 啊,对不起。那应该是[日期]。我现在会修正我的答案。我不确定为什么它不适合您;我还会添加一个屏幕截图。
  • @cookiemnstr247,如果这个答案对你有帮助,你能接受吗?
【解决方案2】:

我使用以下解决方案来处理超过 2 行/日期的组。

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

RankDatePerUnit:

  Rank([EventDate],[Group_Name])

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

TimeSinceLastEvent:

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

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

【讨论】:

    猜你喜欢
    • 2013-08-23
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多