Spotfire:如何计算无视深度回退的连续最大深度
实现不受深度回退影响的历史最大深度计算列
针对你遇到的深度回退时历史最大深度计算失效的问题,以下几种方法可以实现需求中的Continuous (Max) Depth:
方法1:累积MAX窗口函数(通用SQL/BI工具)
如果你的工具支持窗口函数(比如SQL、Tableau、Power BI),直接使用MAX()结合累积窗口范围,就能直接计算每行的历史最大值:
SQL示例:
SELECT PRPRTY, Row, [Positive Depth], MAX([Positive Depth]) OVER ( PARTITION BY [PRPRTY] ORDER BY [Row] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS [Continuous (Max) Depth] FROM your_dataset;
Tableau/Power BI计算字段示例:
在Tableau中创建计算字段,设置为表计算,计算依据选择PRPRTY和Row的排序:
MAX([Positive Depth]) OVER ( PARTITION BY [PRPRTY] ORDER BY [Row] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW )
逻辑说明:按PRPRTY分组,按行号顺序遍历,计算从第一行到当前行的Positive Depth最大值,无论当前行深度是否回退,都会保留历史峰值。
方法2:迭代比较计算(适合支持迭代的BI工具)
如果窗口函数受限,可以用迭代逻辑,逐行比较当前深度与上一行的历史最大值:
Tableau计算字段示例:
创建计算字段Continuous (Max) Depth:
IF FIRST() = 0 THEN [Positive Depth] ELSE MAX(LOOKUP([Continuous (Max) Depth], -1), [Positive Depth]) END
将该字段设置为表计算,计算依据选择PRPRTY,排序依据为Row。
逻辑说明:第一行直接取当前深度,后续每行取上一行的历史最大值与当前深度的较大值,确保历史峰值不会被回退覆盖。
方法3:递归CTE(SQL环境)
如果是在支持递归的SQL数据库(如PostgreSQL、SQL Server)中,用递归CTE逐行迭代计算:
WITH recursive depth_cte AS ( -- 初始行:取每个PRPRTY的第一行 SELECT PRPRTY, Row, [Positive Depth], [Positive Depth] AS [Continuous (Max) Depth] FROM your_dataset WHERE Row = 1 UNION ALL -- 递归迭代:逐行比较当前深度与上一行的历史最大值 SELECT d.PRPRTY, d.Row, d.[Positive Depth], GREATEST(d.[Positive Depth], c.[Continuous (Max) Depth]) AS [Continuous (Max) Depth] FROM your_dataset d JOIN depth_cte c ON d.PRPRTY = c.PRPRTY AND d.Row = c.Row + 1 ) SELECT * FROM depth_cte ORDER BY PRPRTY, Row;
问题根源说明
你之前使用的Last([Positive Depth])逻辑仅取上一行的深度值,当深度回退时,上一行的深度可能小于历史最大值,导致无法保留峰值。而上述方法都是基于累积最大值或逐行迭代比较的逻辑,能准确追踪历史最大深度,不受回退影响。
内容的提问来源于stack exchange,提问作者AnnonymousAsker
相关产品推荐
相关产品推荐

