在 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] < 6,"Top 5", "Other")
as [Zip Rank in State]
【讨论】:
第一个表达式有效。最初,我没有意识到计算列是在应用于数据的任何过滤器之前计算的,所以一旦我在表达式中包含一些逻辑来模拟应用于数据的过滤器,邮政编码就会在每个州内正确排列。以上是关于在 spotfire 中的数据子集中排名的主要内容,如果未能解决你的问题,请参考以下文章