在 spotfire 中的数据子集中排名

Posted

技术标签:

【中文标题】在 spotfire 中的数据子集中排名【英文标题】:Rank within subsets of data in spotfire 【发布时间】:2016-10-06 10:07:57 【问题描述】:

我正在尝试在 spotfire 中对我的数据子集进行排名。

假设我有一个包含以下 6 列的数据表:

Individual, City, Zip Code, State, Amount1,and Amount2

每个Zip Code 中有数千个唯一Individuals,每个State 中有很多Zip Codes。如何仅显示每个 State 中前 5 个 Zip Codes 的数据(由 SUM()Amount1 定义)?

总结操作顺序;我想为每个Zip Code 总结Amount1,然后在每个State 中按降序排列Zip Codes(只是用于解释目的的中间步骤),最后,只显示每个Zip Codes 中的前5 个State.

我所能想到的就是创建一个计算列,如果它满足我的条件,它将返回 Zip Code,如果不满足,则返回 NULL。我认为它不是最好的,但这是我开始使用的代码:

case  WHEN DenseRank(Sum(Sum([Amount1]) over [ZipCode]) over [State],"desc")<6 then [ZipCode] ELSE NULL END

任何帮助都会很棒。谢谢!

【问题讨论】:

欢迎来到 SO。你能告诉我们你当前的函数有什么错误,并提供一个示例数据集吗? 它为每个州返回一个排名,而不是对每个州内的邮政编码进行排名。然后我将 DenseRank 部分更改为 DenseRank(Sum([Amount1]) over [ZipCode],"desc",[State]) 并解决了该问题(因为邮政编码在每个州内排名)但它仍然不是t 完全正确。我创建了一个只有排名部分的列,但没有正确排名。示例如下: Amount1 (Calc Rnk) [Act Rnk] 15000 (2) [3] 20000 (1) [1] 17500 (4) [2] 5000 (5) [5] 7500(3)[4 ] 好的,目前您创建了一个基于DenseRank(Sum([Amount1]) over [ZipCode],"desc",[State]) 的计算列,这可以让您获得您想要的排名——现在您只需要显示每个州的前 5 名,对吗?跨度> 不,它没有正确排名。我之前的评论很难理解,因为它不会让我开始新行,但在我的示例中,根据数据集计算的排名是括号中的数字(),正确的排名是括号中的排名[]。可以看到,15000 本来应该是第三大的数量,却排在第二大数量。我的实际数据集大约有 200 列和超过 300 万行,所以我认为有一些原因导致 sum() 或排名函数计算不正确 【参考方案1】:

感谢 cmets 的澄清。

DenseRank(Sum([A1]) OVER ([ZipCode]),"desc",[State]) as [Rank]

上述函数将根据[A1] 列中金额的SUM() 在其各自的[State] 中对您的[ZipCode] 进行排名。如果有平局,DenseRank() 不会跳过排名数字。这意味着您可以在前 5 名中拥有超过 5 个 [ZipCode]Use Rank() 如果您想避免这种情况。

然后,您可以为过滤器面板创建一个计算列,或者只在图表的“使用自定义表达式限制数据”部分中过滤它。

If([Rank] &lt; 6,"Top 5", "Other") as [Zip Rank in State]

【讨论】:

第一个表达式有效。最初,我没有意识到计算列是在应用于数据的任何过滤器之前计算的,所以一旦我在表达式中包含一些逻辑来模拟应用于数据的过滤器,邮政编码就会在每个州内正确排列。

以上是关于在 spotfire 中的数据子集中排名的主要内容,如果未能解决你的问题,请参考以下文章

Spotfire 7.6 中的 NPV 和 IRR

从spotfire中的总和和计数创建一个平均列

Spotfire:计算列百分位列

R中的For循环中的子集和索引

百分比计算 - SpotFire

Spotfire 突然无法打开 .accdb