【问题标题】:Retrieving value from previous row in calculated column based on condition根据条件从计算列中的前一行检索值
【发布时间】:2018-08-23 17:07:18
【问题描述】:

我正在 Spotfire 中处理数据。该表有 4 列:

RowID
StudID
IMT
Date

我正在尝试在 Spotfire 中插入一个计算列,以从上一行获取特定 StudID 的日期。不应为特定 StudID 的首次条目填写日期,因为它没有前一行。
详情请参考图片:

【问题讨论】:

    标签: date row spotfire


    【解决方案1】:

    这将是一个使用 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
    

    【讨论】:

    • 感谢 Jason 回答这个问题,但是您提供的解决方案只返回每个组的最后一行中的日期,我想要每行的前一个日期,除了每个组的第一行,将为空白。
    • 我不明白。这复制了示例中的计算列。 link
    【解决方案2】:

    根据 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 以确保它正确排序,就像我对日期列所做的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      相关资源
      最近更新 更多