我有以下数据集:
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
答案 0 :(得分: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
)
英文:“如果此行中[日期]列的值与此[ItemId]和[ClientId]组合的最早日期相匹配,则将第一个和最后一个[日期]之间的天数差异设为这个[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
警告过滤器可能会破坏此计算。例如,如果您基于[日期]过滤,并且以上表为例,过滤掉2014年12月之前的所有日期,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
答案 1 :(得分:0)
我使用以下解决方案来处理具有超过2行/日期的组。
首先创建一个计算列,以按日期提供每个组中的排名顺序:
RankDatePerUnit:
Rank([EventDate],[Group_Name])
然后另一个计算列使用over表达式引用组中的上一个日期来进行日期比较。
TimeSinceLastEvent:
DateDiff("day",
First([EventDate]) OVER (Intersect([Group_Name], Previous([RankDatePerUnit]))),
[EventDate])
注意:重复日期可以通过使用densityrank进行不同处理。上面的方法不会在同一组中具有重复时间的两行之间计算零日期差异。如果存在,他们都会从同一组中的较早日期计算其增量。