Power Query:当特定值出现在另一列中时如何向列添加一个

2023-12-08

我有一个 ID 列,并且我正在寻找每次特定项目出现在我的列表中时增加我的 ID 的方法Geography柱子 (ItalyZ, ItalyM, UKY or UKM)被发现。

身份证号为ItalyZ从 0 开始,到 4000 结束。

身份证号为ItalyB从 4000 开始,到 8000 结束。

身份证号为UKY从 0 开始,到 4000 结束。

身份证号为UKM从 4000 开始,到 8000 结束。

然而,我正在刷新我的文件,因此我会时不时地收到新的“地理位置”,但没有来源或第一个 ID。这些边界/范围仅是已知的开始和结束。

这是我的数据示例:

  |---------------------|------------------|    
  |       ID            |   Geography      |
  |---------------------|------------------|
  |    AB0000           |      ItalyZ      |
  |---------------------|------------------|
  |    AB4041           |      ItalyB      |
  |---------------------|------------------|
  |    BC0000           |      UKY         |
  |---------------------|------------------|
  |    BC4001           |      UKM         |
  |---------------------|------------------|
  |    NULL             |      ItalyZ      |
  |---------------------|------------------|
  |    NULL             |      ItalyZ      |
  |---------------------|------------------|
  |    NULL             |      UKY         |
  |---------------------|------------------|
  |    NULL             |      UKM         |
  |---------------------|------------------|  

这是我的预期输出:

  |---------------------|------------------|    
  |       ID            |   Geography      |
  |---------------------|------------------|
  |    AB0000           |      ItalyZ      |
  |---------------------|------------------|
  |    AB4041           |      ItalyB      |
  |---------------------|------------------|
  |    BC0000           |      UKY         |
  |---------------------|------------------|
  |    BC4001           |      UKM         |
  |---------------------|------------------|
  |    AB0001           |      ItalyZ      |
  |---------------------|------------------|
  |    AB0001           |      ItalyZ      |
  |---------------------|------------------|
  |    AB4042           |      UKY         |
  |---------------------|------------------|
  |    BC0001           |      UKM         |
  |---------------------|------------------|  

我一直在尝试多种方法并尝试适应跑步整体解决方案。我还尝试将我的文件分成四个不同的文件,以免 If 函数在不同情况之间交替,从而使其更简单,就像我的强力查询中的这样:

 #"Added Custom2" = Table.AddColumn(#"Reordered Columns", "Sum", each if [Geography] = "UKM" then [Number AB range below 4000] + 1 
else if [Geography] = "UKY" then [Number AB range above 4000] + 1 
else if [Geography] = "ItalyB" then [Number BC range above 5000]
else [Number BC range below 5000] + 1)

但绝对没有任何效果。这令人抓狂。


我将回答一个进一步简化的问题,因为我不想解决ID字母前缀。

假设我们有下表(我已包括:

ID,  Group
-----------
0,     A
1,     A
300,   B
525,   C
null,  A
null,  B
null,  B
null,  C

并想要生成一个新列NewID这将取代ID.

ID,  Group, NewID
------------------
0,     A,   0
1,     A,   1
300,   B,   300
525,   C,   525
null,  A,   2
null,  B,   301
null,  B,   302
null,  C,   526

这是一个使用的方法Table.AddIndexColumn:

let
    Source = <First Table Above>,
    #"Grouped Rows" = Table.Group(Source, {"Group"}, {{"ID", each List.Max([ID]), type number}}),
    #"Added Custom" = Table.AddColumn(#"Grouped Rows", "Custom", (C) => Table.AddIndexColumn(Table.SelectRows(Source, each _[Group] = C[Group]),"NewID",C[ID],1)),
    #"Expanded Custom" = Table.ExpandTableColumn(#"Added Custom", "Custom", {"NewID"}, {"NewID"}),
    #"Removed Columns" = Table.RemoveColumns(#"Expanded Custom",{"ID"})
in
    #"Removed Columns"

首先,我们分组Group找到最大值ID per Group:

Group By

然后我们添加一个新列,其中该列中的每一行都是table通过将原始表过滤到当前组然后添加从最大值开始的索引列来定义ID我们刚刚发现。这是最复杂的步骤。

Add table column

从这里开始,我们扩展了Custom表列(选择我们还没有的列)并删除旧的ID柱子。现在我们需要缺少我们选择执行的任何排序或列类型。

Final


Edit:我在上面犯了一个错误。请注意,NewID for Group A is 1,2,3代替0,1,2我正在努力。

要解决这个简单示例的问题,您可以使用List.Min代替List.Max在分步进行中。

对于更复杂的示例,您可能需要向源表添加索引列,以便您可以在扩展后合并回源表,并且仅使用新的NewID对于先前为空的ID值,因为我们不能保证它们是连续的。

这是代码:

let
    Source = <First Table Above>,
    #"Added Index" = Table.AddIndexColumn(Source, "Index", 0, 1),
    #"Grouped Rows" = Table.Group(#"Added Index", {"Group"}, {{"ID", each List.Max([ID]), type number}}),
    #"Added Custom" = Table.AddColumn(#"Grouped Rows", "Custom", (C) => Table.AddIndexColumn(Table.SelectRows(Table.Sort(#"Added Index",{"ID"}), each _[Group] = C[Group]),"NewID",C[ID]+1,1)),
    #"Expanded Custom" = Table.ExpandTableColumn(#"Added Custom", "Custom", {"Index", "NewID"}, {"Index", "NewID"}),
    #"Merged Queries" = Table.NestedJoin(#"Added Index", {"Index"}, #"Expanded Custom", {"Index"}, "Expanded Custom", JoinKind.LeftOuter),
    #"Expanded Expanded Custom" = Table.ExpandTableColumn(#"Merged Queries", "Expanded Custom", {"NewID"}, {"NewID"}),
    #"Added Custom1" = Table.AddColumn(#"Expanded Expanded Custom", "ReplaceID", each if [ID] = null then [NewID] else [ID]),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom1",{"ID", "NewID"})
in
    #"Removed Columns"

复杂的步骤只发生了一点变化:

(C) => Table.AddIndexColumn(
           Table.SelectRows(
               Table.Sort(#"Added Index", {"ID"}),
               each _[Group] = C[Group]
           ),
           "NewID", C[ID] + 1, 1
       )

不同之处在于我们需要添加排序,以便空值出现在所有已分配的值之后ID值并开始对空值进行索引C[ID] + 1而不仅仅是C[ID].


这是一个步骤较少的版本(没有分组依据、扩展或合并),但功能稍微复杂一些:

let
    Source = <First Table Above>,    
    #"Added Index" = Table.AddIndexColumn(Source, "Index", 0, 1),
    #"Added Custom" = Table.AddColumn(#"Added Index", "Custom", (C) => Table.SelectRows(#"Added Index", each _[Group] = C[Group])),
    #"Added NewID" = Table.AddColumn(#"Added Custom", "NewID", (C) => if C[ID] = null then Table.SelectRows(Table.AddIndexColumn(Table.SelectRows(C[Custom], each _[ID] = null), "NewID", List.Max(C[Custom][ID])+1,1), each _[Index] = C[Index]){0}[NewID] else C[ID]),
    #"Removed Columns" = Table.RemoveColumns(#"Added NewID",{"Custom"})
in
    #"Removed Columns"

第一个添加的Custom列只是过滤到当前的索引源表Group。然后我们添加NewID列定义为:

(从内到外阅读。)

(C) =>
  if C[ID] = null
  then Table.SelectRows(
           Table.AddIndexColumn(
               Table.SelectRows(C[Custom], each _[ID] = null),
               "NewID", List.Max(C[Custom][ID]) + 1, 1
           ),
           each _[Index] = C[Index]
       ){0}[NewID]
  else C[ID]

与之前类似,我们取组子表Custom,只需选择 nullID行并从最大非空值开始索引它们ID加一。这仍然给我们留下了一个表,所以我们只想要这个子表中与Index从整个表。我们用{0}[NewID]从表格中第一(唯一)行的单元格中提取值[NewID]柱子。对于非空ID值,else 子句只是让它们保持原样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Power Query:当特定值出现在另一列中时如何向列添加一个 的相关文章

  • C# 和 C++ 中 ++i 运算符的区别

    我用 C 和 C 编写了以下代码 int i 0 i 11 此 C 编译器出现错误后 The left hand side of an assignment must be a variable property or indexer 但是
  • BASH - 使用 Loop 和 If 语句总结唯一字段中多个字段的信息

    我有以下制表符分隔的文件 A1 A1 0 0 2 1 1 1 1 1 1 1 2 1 1 1 A2 A2 0 0 2 1 1 1 1 1 1 1 1 1 1 1 A3 A3 0 0 2 2 1 1 2 2 1 1 1 1 1 1 A5 A5
  • 如何在 JavaScript 的“if”语句中指定多个条件[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 这是我试图提及两个条件的方式如果这个或这个 但它不起作用 if Type 2 PageCount 0 Type 2 PageCou
  • 如何在 Python 中将输入打印为整数、浮点数或字符串

    我的代码的目的是让输出给出输入的数字和类型 例如 如果输入是 10 输出应该是 10 is an integer 如果输入是 10 0 输出应该是 10 0 is a float 如果输入是 Ten 输出应该是 Ten is a strin
  • if..else 或 Select..case 哪个更快?

    我有三个条件可以比较 以下两者哪一个更快 请指出我 谢谢大家 If var 1 then Command for updating database ElseIf var 2 then Command for updating databa
  • Java 中子字符串与字符串的比较

    所以基本上 用户输入 2 个字符串 CATSATONTHEMAT AT 我们需要计算第二个字符串在第一个字符串中出现的次数 所以这里的答案是 3 这就是我到目前为止所拥有的 而且它一直在说 线程 主 中的异常 java lang Strin
  • 带有条件 isset 的 If 语句和比较不能一起工作

    我在制作时遇到问题if声明 code if detail variable exists and is equal to 1 code if detail variable doesn t exist or is not equal 1 由
  • 根据列的值从其他列获取值

    对于数据框中的每一行 我想根据第三列中的值将值从一列复制到另一列 我尝试使用组合的 for 循环和 if 函数来做到这一点 example condition lt c 1 2 2 1 2 3 3 SZ01 lt c 1 1 1 1 1 1
  • Bash shell 中的“[ ]”与“[[ ]]”[重复]

    这个问题在这里已经有答案了 这可能已经得到回答 但我还是要问 我有两个版本的脚本 comp sh bin sh export tDay date Y m d newfile filename tDay filename filename 2
  • “else”在Python中被认为是有害的?

    In an answer https stackoverflow com questions 855759 python try else 855783 855783 by S Lott https stackoverflow com us
  • 如何将切片器值设置为Power BI中第一个可用值表单表?

    我要求切片器中所选的值必须有效 让我们假设如果我在商店切片器中选择一个值 并且该商店将从公司中删除 切片器仍将显示其名称 但与切片器交互的视觉效果中没有数据 选择默认值 手动更新切片器值 但我只想在我的商店切片器中选择相关商店 我知道它的切
  • 使用 Redis 命令 incr 和 expire 时的竞争条件

    根据redis文档 http redis io commands incr http redis io commands incr 在段落模式 速率限制器 2 较短的版本代码 value INCR ip IF value 1 THEN EX
  • 定时器启动/停止参数

    自从加入这个社区以来 我在技能和进步方面取得了突飞猛进的进步 你们都是一个巨大的帮助 我无法提供一个计时器 该计时器已在启动和停止时实现了某些参数 我要么收到错误消息 局部变量计时器可能尚未初始化 要么没有收到错误消息 但什么也没有发生 也
  • SnowFlake 和 Power BI“此值不支持本机查询”

    快速注意 我已经查看了这些线程 但它们没有解决我的问题 过时的信息 请参阅下面的文档 通过PowerBI访问Snowflake查询结果 https stackoverflow com questions 65483722 access sn
  • 使用 laravel 检查活动用户状态

    这是非常标准的登录功能和验证 效果很好 但我还想检查用户是否处于活动状态 我在用户表中设置了一列 并将 活动 设置为 0 或 1 public function post login input Input all rules array
  • python 中未定义变量

    你好 我对 python 编程很陌生 我正在开始我的第一个程序 但我遇到了一些麻烦 有没有更好的方法来执行下面的代码片段 当我运行该程序时 我得到 yes no 未定义 def main print n Welcome to registr
  • PHP if in_array 表示多个值

    我有一个由 3 到 12 个值之间的任意位置生成的数组 它根据帐户信息生成该数组 result ad gt user gt groups user username 我想检查这个数组是否有多个值 大约 4 或 5 个 如果其中有任何一个值
  • If 语句中 Bool 计算错误

    只是为了好奇 我的代码有这个问题 e被评估为false 我知道通过查看数据库中的数据会得到错误 但 if 语句并不关心这一点 并假设这是真的 并试图抛出异常 有什么想法吗 edit 没有 在第 16 行末尾 价值false是正确的 我已经检
  • JavaScript 单行“if”语句 - 最好的语法,这个替代方案吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 尽管意见仍然如此 但已经明确指出 放弃单行中的大括号if语句的可维护性和可读性并不理想 但这又如何呢 if lemons document wr
  • 如何使用批处理文件复制(和增量)文件的多个实例

    我需要创建一个批处理文件来复制文件并在将其放置到目的地时递增它 例子 copy C TEMP MyDoc txt E MyData 本质上 我需要这个复制命令在每次启动时进行复制 现在效果很好 我希望它增加文件名而不是覆盖它 如果我运行此命

随机推荐