按范围过滤表

时间:2018-04-03 14:58:02

标签: merge powerquery

我有一个父表和一个子表。父表仅列出属性范围。我想合并这两个来创建一个合适的层次结构,但我需要一种方法来首先按父范围过滤子表,我相信。

以下是父表的示例:

parent_item     start_attribute     end_attribute
A               10                  120
B               130                 130
C               140                 200

和子表:

child_item      child_attribute
U               10
V               50
W               60
X               130
Y               140
Z               150

我要找的输出表是这样的:

parent_item     child_item
A               U
A               V
A               W
B               X
C               Y
C               Z

为了进一步混淆事物,属性是字母数字,这消除了使用我相信的List.Generate()函数。我想我正在寻找类似于DAX中的EARLIER()函数的东西,但我不确定我是否正在以正确的方式看待这个问题。这是我的伪代码,因为我看到它正常工作:

Table.AddColumn(
    #"parent_table", 
    "child_item",
    each 
        Table.SelectRows(
            child_table, 
            each ([child_attribute] <= EARLIER(end_attribute) and [child_attribute]>= EARLIER(start_attribute) )
            )
    )

这是一种简化,因为子表实际上包含五个属性,而父表包含五个相应的属性范围。

2 个答案:

答案 0 :(得分:1)

一种可能的方法是进行完全交叉连接,然后过滤掉你不想要的行。

  1. 在两个表上创建一个自定义列,其值为常量,例如,1。

  2. Child表合并到与新列匹配的Parent表中。

  3. Cross Join

    1. 展开Child表格以获得如下表格:
    2. Expand Child

      1. 使用所有需要的逻辑创建自定义列。例如,

        if [child_attribute] >= [start_attribute] and [child_attribute] <= [end_attribute] then 1 else 0

      2. 仅过滤此新列中的1值。

      3. 删除除parent_itemchild_item以外的所有其他列。

答案 1 :(得分:1)

我找到了this blog post,它掌握了引用当前行环境的关键。主要内容是:

  

每个都是创建简单函数的关键字。 每个(_) =>的缩写,其中下划线表示(如果您在表格环境中,就像我们一样)当前行

C使用新功能child_table,我们可以写

= Table.AddColumn(#"parent_table", "child_table", each
      Table.SelectRows(Child, (C) =>
          C[child_attribute] >= [start_attribute] and
          C[child_attribute] <= [end_attribute]))

或更明确地作为

= Table.AddColumn(#"parent_table", "child_table", (P) =>
      Table.SelectRows(Child, (C) =>
          C[child_attribute] >= P[start_attribute] and
          C[child_attribute] <= P[end_attribute]))

添加此列后,只需展开新child_item列中的child_table列。