Spotfire DenseRank按类别分类,我是否使用OVER?

时间:2018-11-30 14:20:01

标签: spotfire rank

我试图在Spotfire中对某些数据进行排名,并且在编写公式进行计算时遇到了一些麻烦。这是我正在使用的东西的分解。

组:测试组

SNP:我正在查看的SNP

计数:我为特定SNP获得多少计数

我想做的是对组中每个SNP的平均计数进行排名。这样,我便可以在一个组中看到哪个SNP排名#1,#2等。

谢谢!

1 个答案:

答案 0 :(得分:1)

TL; DR免责声明:您可以执行此操作,但是如果您经常更改交叉表,则可能会变得很麻烦。确保仔细检查逻辑是否符合您所做的任何修改。 谨慎行事。

您似乎要查找的自定义表达式的基础如下:

Max(DenseRank(Count() OVER (Intersect([Group],[SNP])),"desc",[Group]))

这给出的是行的总数而不是平均值;我不确定“ Count”是否应该作为一列。如果您确实希望将其转换为平均值,请确保进行相应的调整。

如果只有“组”和SNP嵌套在左侧,则说明您已做好准备,可以继续进行。

第一个问题,当您希望对其进行过滤时,它只为您提供过滤集中的那些的密集等级。在某些情况下,这很好,而且您要寻找的是什么?在其他情况下则不是。如果希望它快速保持其值,而不考虑过滤,则可以使用相同的逻辑,但是将其放在Calculated列中,而不是在自定义表达式中。然后,在CrossTable聚合中,获取“计算列”值的最大值。

计算列:

DenseRank(Count() OVER (Intersect([Group],[SNP])),"desc",[Group])

第二个问题:您想以组和SNP之外的其他方式来进行轮转。例如,也许按日期?如果将日期放在顶部,则每个月将显示相同的数字-总数。这不是特别有用。

在一定程度上,Spotfire的自定义表达式可以处理此修改。如果您在使用单列之间切换,则可以使用以下内容:

Max(DenseRank(Count() OVER (Intersect([${Axis.Columns.ShortDisplayName}],[Group],[SNP])),"desc",[Group],[${Axis.Columns.ShortDisplayName}]))

这将自动从顶部拉出该列,并向您显示每个流程日期的排名。

但是,如果您开始嵌套,使用层次结构,重命名列或在顶部进行多次聚合并抛出(列名),则您将不得不为自定义表达式付出很多。您将需要在Axis.Column周围进行某种形式的字符串替换,或者使用表达式代替短名称,并摆脱Nests等。

任何层次的复杂性都需要进行这种分析,因此,如果您的最终用户有权修改数据透视表...老实说,我可能不会在此列。

第三期:我不知道这到底是不是一个问题,但是您说的是“平均数”-每天的平均数?每月?

在求平均值时,您将需要确定,例如,一个月是一个月中的总天数,还是特定付款人拥有数据的天数。但是,您决定对其进行汇总,请确保在正确的级别上进行操作。

作为记录,我喜欢这个问题的前提。以前我认为这很有用,但从未花时间尝试实现,因为对列进行排序或将表限制为仅显示前10个值要简单得多