经常会有小伙伴问,我的表为什么展开前和展开后的结果不一样?为什么删除了重复到下面又变了?为什么结果和我想的不一样?是不是有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.Buffer
或List.Buffer
。
大写的赞!套个公式解决问题。以前每次排序前,都点点击“检测数据类型”规避这个Bug
排序后点“检测数据类型”有没有什么关系?
也可以添加一索引列,在删除,就不会出现乱序了
您好!请教一下,我如果只想对一个字段的数据进行分类汇总,比如我想统一”品名“项下,各个品种的数据(按每个品种分别汇总),不受其他筛选字段的影响,请问函数要怎么设置?谢谢!
【开始】——【分组依据】
老师呀,不太明白,能详细一点吗?
可视化菜单里有的啊
按提示选择分组列和聚合列就行了
这个还是不能解决数据从pq上载到power bi后的乱序问题,行序列序都会变....请问这个怎么解决?关注这个是因为需要把数据全部下载下来进一步处理,pq不能一次下载全部数据,而pbi里的顺序又乱的
我也有这个问题,暂时是无解,我只能放弃行列顺序,pq上载到pbi中的表导出后再导入pbi中,重新排序,很麻烦的
我发的评论怎么跳不出来
虽然很多年后才看到,仍然想说感谢分享。太喜欢您的博客了。
倒序排序后再上载到excel表里的,顺序也不是倒序的,这个怎么解决呢
到现在我都没整明白Buffer到底有什么作用,之前用过,但是似乎会导致数据更新不及时。
用Buffer会影响性能(可能更快可能更慢),本地数据源用Table.StopFolding稳定一些。