关于排序后状态不稳定的问题

经常会有小伙伴问,我的表为什么展开前和展开后的结果不一样?为什么删除了重复到下面又变了?为什么结果和我想的不一样?是不是有BUG?如果遇到这种情况,多半是排序搞的鬼。来看一组数据:

产品a和b都有多条记录,我想每个产品只保留最大值,其他的都删掉。
方法有很多种,为了演示本文的主题我们选择最不科学的一种:

let
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    排序的行 = Table.Sort(源,{{"数量", Order.Descending}}),
    删除的副本 = Table.Distinct(排序的行, {"产品"})
in
    删除的副本


首先对[数量]列进行降序排列,让大的在上面,然后对[产品]列进行去重。去重的机制是保留所选依据第一次出现的位置而删除后面的,图中产品b第一次出现是第一行,对应的数量为83,产品a第一次出现是在第四行,对应的数量为67,所以结果应该是两行分别为b,83和a,67是不是?来看下结果:

我咧个擦,这什么情况?为什么和我们想的不一样?
 
再来仔细观察下源数据,发现最终结果的73和47,分明就是原来的顺序嘛:源数据中a第一次出现在第一行,对应的数量为47,b第一次出现的位置在第六行,对应的数量为73。

注意我们刚才排序后,在字段右边的图标如上图左边所示,而正常的图标应该是右边那样。简单来说,就是排序后的状态不稳定,如果直接进行后续操作,可能会发生各种意料不到的情况,比如本文开头。。。
所以正确的做法就是在Table.Sort外面套一个Table.Buffer,使其转换成一个稳定的内存表。
把系统生成的公式改为= Table.Buffer(Table.Sort(源,{{"数量", Order.Descending}}))

显示结果正确。
 
一句话总结:凡是遇到排序,不管是Table.Sort还是List.Sort,第一反应在外面套个Table.BufferList.Buffer

14 Replies to “关于排序后状态不稳定的问题”

  1. 大写的赞!套个公式解决问题。以前每次排序前,都点点击“检测数据类型”规避这个Bug

  2. 您好!请教一下,我如果只想对一个字段的数据进行分类汇总,比如我想统一”品名“项下,各个品种的数据(按每个品种分别汇总),不受其他筛选字段的影响,请问函数要怎么设置?谢谢!

  3. 这个还是不能解决数据从pq上载到power bi后的乱序问题,行序列序都会变....请问这个怎么解决?关注这个是因为需要把数据全部下载下来进一步处理,pq不能一次下载全部数据,而pbi里的顺序又乱的

    1. 我也有这个问题,暂时是无解,我只能放弃行列顺序,pq上载到pbi中的表导出后再导入pbi中,重新排序,很麻烦的

  4. 到现在我都没整明白Buffer到底有什么作用,之前用过,但是似乎会导致数据更新不及时。

  5. 用Buffer会影响性能(可能更快可能更慢),本地数据源用Table.StopFolding稳定一些。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注