在Power BI中删除重复数据 - 数据查询篇(Power Query)
常见的数据处理有一种需求是以某几个特定列内容为基准删除掉列中的重复数据。例如下面一个张销售表单中,如果以Date列和Product列为基准,能发现4月1日Product A产品有重复记录。
如果想去掉重复记录,可以在查询编辑器中,同时选择Date列和Product列,然后右键选择Remove Duplicates选项。Power BI去重后运行结束后,能发现最后一条Sale = 400的记录被删除了,只保留了最开始一行的Sale = 100的记录。这是由于Power BI后台调用M语言去重时按照原始数据的导入顺序进行,会保留序号在前的数据而删除序号在后的数据。
如果想保留Sale = 400这一行数据而删除Sale = 100这条数据是否可以利用通过对原始数据重新排序来实现呢?可以试验一下,将数据按照Date列做升序排序,再选择sale列做降序排序去获得一张新表,使得4月1日这天Product A产品Sale = 400这条数据排在Sale = 100之前。 然后选择Date和Product列去删除duplicated数据。运行结束后发现结果与不排序相同,M语言仍然删除了Sale = 400这条数据。
之所以出现这样的结果是因为M语言中的排序操作比较特殊,当前排序结果不会作为下一步脚本执行的原数据。也就是说,虽然调用了M中的Sort方法对数据进行排序,但实际上Remove duplicated动作使用的还是Sort上一步未排序的数据。
要解决该问题,需要调用Table.Buffer函数将Sort的结果强行缓存到table当中,以便作为Remove Duplicated操作的数据源。
M Code如下:
let
Source = Excel.Workbook(File.Contents("C:\Users\jessica\Desktop\Book1.xlsx"), null, true),
Duplicate_Sheet = Source{[Item="Duplicate",Kind="Sheet"]}[Data],
#"Promoted Headers" = Table.PromoteHeaders(Duplicate_Sheet, [PromoteAllScalars=true]),
#"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Date", type date}, {"Sale", Int64.Type}, {"Product", type text}}),
#"Sorted Rows" = Table.Sort(#"Changed Type",{{"Date", Order.Ascending}, {"Sale", Order.Descending}}),
#"Buffer Tabe" = Table.Buffer(#"Sorted Rows"),
#"Removed Duplicates" = Table.Distinct(#"Buffer Tabe",{"Date", "Product"})
in
#"Removed Duplicates"
上一篇: sql_查询表中的重复数据