首先,您好,感谢您花时间阅读本文。我已经考虑解决这个问题一段时间了,现在决定是时候了。问题如下:
假设我们有如下的预约表:
每个标题都指向一种预约类型,例如牙科、心理、理疗等,在我的例子中,最多可以扩展到 30 列。我如何才能有效地找出这样的表格中哪个数字发生了变化?我的实际数据集包含 10k+ 行,总共约 55 行(但只需要在其中 30 列中拾取更改,所有列都彼此相邻。)
一开始,我想用 SUM 把字段中的所有值加起来,看看是否有变化,但还有 30 列需要查看,并手动找出发生变化的位置。那么,我可以使用什么公式或公式组合来找出一行字段中的差异,然后找出差异属于哪一列,并在新列中打印出列标题?
PS 有重复。
答案1
如果我理解正确的话:
比较具有相同 ID 的行,并找出日期较晚的行与日期较早的行不同的列。
最简单的方法是使用 Power Query。
这是 Power Query 中高级编辑器的代码。如果您不确定如何使用它,请继续阅读。
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
//make the table tall instead of wide
Unpivot = Table.UnpivotOtherColumns( Source , {"ID","ApptDate"} , "ApptType" , "Value"),
//join the table with itself on ID and date < other date
Crossjoin = Table.AddColumn(
Unpivot,
"crossjoin",
(outer) => Table.SelectRows(
Table.PrefixColumns(Unpivot,"New"),
(inner) => outer[ID] = inner[New.ID] and
outer[ApptType] = inner[New.ApptType] and
outer[ApptDate] < inner[New.ApptDate] and
outer[Value] <> inner[New.Value]
)
),
//get only those rows where the value has changed
Changes = Table.SelectRows( Crossjoin , each not Table.IsEmpty([crossjoin])),
//expand the crossjoin column
Expand = Table.ExpandTableColumn( Changes , "crossjoin" , {"New.ApptDate","New.Value"})
in
Expand
- 如果尚未转换,请将数据转换为表格。将光标放在范围内的任意位置,然后按 Ctrl+T。
- 使用日期>获取数据>从其他来源>空白查询:
Power Query 编辑器将打开。
- 在主页选项卡上,单击“高级编辑器”。它将如下所示:
删除那里的代码并将其替换为上面的代码
单击高级编辑器上的完成
使用主页>关闭并加载
结果如下:
对于每个值差异,都会有一行,其中 B 列中的日期与 E 列中的日期、C 列中的约会类型和 A 列中的 ID 进行了比较。