【发布时间】:2018-08-23 17:07:18
【问题描述】:
我正在 Spotfire 中处理数据。该表有 4 列:
RowID
StudID
IMT
Date
我正在尝试在 Spotfire 中插入一个计算列,以从上一行获取特定 StudID 的日期。不应为特定 StudID 的首次条目填写日期,因为它没有前一行。
详情请参考图片:
【问题讨论】:
我正在 Spotfire 中处理数据。该表有 4 列:
RowID
StudID
IMT
Date
我正在尝试在 Spotfire 中插入一个计算列,以从上一行获取特定 StudID 的日期。不应为特定 StudID 的首次条目填写日期,因为它没有前一行。
详情请参考图片:
【问题讨论】:
这将是一个使用 OVER function 以及 Intersect、Previous 和 First 聚合的计算列。
First([Date]) OVER Intersect(Previous([Date]), [StudID])
上面写着:在(组)前一个(到当前行)日期(相同)和学生 ID(与当前行相同)之间的交集处,给我该组的第一行.在您的示例中,它只会为该组返回一个日期,但公式需要能够处理如果有多行会发生什么。您可能还需要考虑这是否会在您的数据中发生以及您将如何处理它。即
StudID Date
124-639 6/12/2018
124-639 6/12/2018
124-639 6/14/2018
【讨论】:
根据 JasonJ 的回答,当不同 StudID 的日期相互重叠时,他的解决方案似乎遇到了问题。
所以我看到了类似的东西:
StudID, Date, Result
A, 10/1/2014,
A, 10/10/2014, 10/1/2014
A, 10/17/2014, 10/10/2014
B, 10/20/2014,
A, 10/21/2014,
B, 10/22/2014,
B, 10/24/2014, 10/22/2014
我通过添加另一个计算列创建了一个奇怪的解决方法。 我怀疑这是执行此操作的理想方法(我敢打赌有更好的 OVER 功能,但我无法立即识别它),但看起来它正在工作。
第一个计算列(名为 [CalcRank]):
Rank(Concatenate([StudID],Year([Date]),If(DayOfYear([Date])<10,"0",""),If(DayOfYear([Date])<100,"0",""),DayOfYear([Date])))
第二个计算列:
Max([Date]) OVER (Intersect(Previous([CalcRank]),[StudID]))
请注意,您可能必须用 0 填充您的 StudID 以确保它正确排序,就像我对日期列所做的那样。
【讨论】: