加入 PowerBI自己学 知识星球:下载源文件,边学边练;遇到问题,还可以提问交流。
有一张系统输出的事实表,是按照门店和日期时间(连续的以1小时为间隔)生成的当天的累计数量,现需要在PowerQuery中还原成每个日期时间对应的当期的数量。
解决方案
优先考虑在上游系统中对数据源进行调整;在PowerQuery中,按门店、日期时间排序,然后按门店取出累计列当前行的上一行数据,然后用累计数字减去上一行累计数字就得到了当期数字。
当然,通过DAX也能解决这个问题,但不建议这样做,因为数据清洗最好在数据加载前PowerQuery中完成,以减少冗余数据和对运行内存的占用。
操作步骤
STEP 1 PowerQuery获取数据后,选中门店列,点击菜单栏转换下的分组依据,在跳出的对话框中修改新列名为待处理,操作选择所有行。
STEP 2 在生成的查询步骤代码中修改,为每个门店对应的小表中增加排序列。
Table.Group(更改的类型, {"门店"}, {"待处理", each Table.AddRankColumn(_,"门店按日期时间排序",{"日期时间",Order.Ascending},[RankKind=RankKind.Ordinal])})
这里用到了新增排序列函数Table.AddRankColumn,升降序参数为升序,排序类型参数为不重复序号。“_”代表的是当前的小表。点击待处理列单元格里的Table,可查看小表的内容,A店对应的是A店下的所有行,新增了一列排序列。
STEP 3 点击待处理列标题右侧的展开按钮,去掉门店的挑勾以免字段重复,去掉使用原始列名作为前缀的挑勾以保持列名的简洁性。
STEP 4 如果PowerQuery生成的步骤名称是中文,在STEP3生成的查询步骤上面点击鼠标右键重命名为展开表(名称不带中文引号即可,有引号不方便后面引用该步骤)。
STEP 5 点击菜单栏添加列下的自定义列,在跳出的对话框中输入如下代码,增加一个数量列。这里调取了上一步骤的表中的门店与当前行门店相等、序号等于当前行序号-1的累计数量列的值。
Table.AddColumn(展开表, "数量", each if [门店按日期时间排序]>1
then [累计数量]-展开表{[门店=[门店],门店按日期时间排序=[门店按日期时间排序]-1]}[累计数量]
else [累计数量])
STEP 6 删除不需要的列,去掉累计列,保留数量列,修改数据类型,如下: