pivot-table - 使用 powerquery 将具有多列的表还原为具有两列的表,这些列表示原始表中的日期对?
问题描述
想象一下,我有一个“水平”数据集,其中包含:
- 唯一键
- 跨多个列的多个“对”日期(即事件 A 开始、事件 B 开始、事件 C 开始等,以及事件 A 结束、事件 B 结束、事件 C 结束等的单独列)。
- 特定“事件”的单个日期(不是一对)。
本质上,看起来像这样:
数据集
唯一键 | 事件 A 开始 | 活动结束 | 单日活动 | 事件 B 开始 | 活动 B 结束 | 第二次单身约会活动 |
---|---|---|---|---|---|---|
键 1 | 2021 年 1 月 1 日 | 2021 年 1 月 3 日 | 2021 年 1 月 2 日 | 2021 年 1 月 5 日 | 2021 年 1 月 10 日 | 2021 年 1 月 10 日 |
关键 2 | 2021 年 1 月 7 日 | 2021 年 1 月 10 日 | 无效的 | 无效的 | 无效的 | 无效的 |
如何使用 PowerQuery 将上面的数据集转换为这样的表?
预期输出:
唯一键 | 事件 | 开始日期 | 结束日期 |
---|---|---|---|
键 1 | 事件 A | 2021 年 1 月 1 日 | 2021 年 1 月 3 日 |
键 1 | 单日活动 | 无效的 | 2021 年 1 月 2 日 |
键 1 | 事件 B | 2021 年 1 月 5 日 | 2021 年 1 月 10 日 |
键 1 | 第二次单身约会活动 | 无效的 | 2021 年 1 月 10 日 |
关键 2 | 事件 A | 2021 年 1 月 7 日 | 2021 年 1 月 10 日 |
我试过了:
- Unpivot,但我无法将“Event A Start”和“Event A End”都重命名为“Event A”。我什至尝试将所有“Event [x] Start”重命名为“Event [x]”,对所有“Event [x]”进行了“unpivot selected”。然后我将所有“Event [x] End”重命名为“Event [ x]”,然后对这些列执行反透视。不幸的是,Key 和 Event 列没有对齐。
- 合并查询:我尝试将一个查询与另一个合并,但它并没有完全获得所需的输出。我创建了两个单独的查询(一个带有键、事件和开始日期;另一个带有键、事件和结束日期)。但这并没有达到预期的效果。我认为这是因为单日期事件为“空”?
我觉得我肯定做错了什么,所以在这里询问是否可以根据输入数据使用 PowerQuery 实现我想要的输出?
解决方案
你肯定需要在 unpivot 之上做一些额外的工作。
这是我的处理方法:
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45W8k6tVDBU0lEyVPBKzFMwMjACcYyROUbIHFNkjqEBLl6sDsRkI6C4OW4teaU5Odip2FgA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Unique Key" = _t, #"Event A Start" = _t, #"Event A End" = _t, #"Single Date Event" = _t, #"Event B Start" = _t, #"Event B End" = _t, #"2nd Single Date Event" = _t]),
#"Unpivoted Columns" = Table.UnpivotOtherColumns(Source, {"Unique Key"}, "Event", "Value"),
#"Changed Type" = Table.TransformColumnTypes(#"Unpivoted Columns",{{"Value", type date}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each if Text.Contains([Event], "Start") then "Start Date" else "End Date"),
#"Transformed Text" = Table.TransformColumns(#"Added Custom",{{"Event", each if Text.EndsWith(_, "Start") or Text.EndsWith(_, "End") then Text.BeforeDelimiter(_, " ", {0, RelativePosition.FromEnd}) else _, type text}}),
#"Pivoted Column" = Table.Pivot(#"Transformed Text", List.Distinct(#"Transformed Text"[Custom]), "Custom", "Value")
in
#"Pivoted Column"
脚步:
- 取消透视日期列
- 添加一个新列以将每一行标记为开始日期/结束日期
- 去掉 [Event] 列中的“Start”/“End”后缀
- 透视第 2 步中的新列
推荐阅读
- ios - 当应用程序打开时应用程序不在内存中时如何调用 openURLContexts?
- excel - VBA:如何等到excel下载完成?
- python - 打印列表中的元素块
- html - 如何修复此 WCAG 错误“此表单控件具有空白标签或标题。”
- oracle - Oracle sql developer 触发器错误 ORA-04088: 执行触发器 'SYSTEM.LRES_PROTOKOLL' 期间出错
- c# - 从特定节点构建树
- ffmpeg - 使用 puppeteer 对页面进行截图,并使用 ffmpeg 从截图图像中生成视频。如何制作流畅的视频?
- postgresql - 如何使用卷从 docker 中的转储或 sql 文件中恢复数据库?
- xamarin - Xamarin Forms Navigation.PushAsync 仅工作一次
- trim - 删除第一个前导零