Power BI - M 查询加入记录匹配范围

Power BI - M query to join records matching range

我有一个导入查询 (table a) 和一个导入的 Excel 文件 (table b),其中包含我正在尝试匹配的记录。

我正在寻找一种方法来在 M:

中复制这种类型的 SQL
SELECT a.loc_id, a.other_data, b.stk
FROM a INNER JOIN b on a.loc_id BETWEEN b.from_loc AND b.to_loc

Table一个

| loc_id   | other data |
-------------------------
| 34A032B1 | ...        |
| 34A3Z011 | ...        |
| 3DD23A41 | ...        |

Table B

| stk    | from_loc | to_loc   |
--------------------------------
| STKA01 | 34A01    | 34A30ZZZ |
| STKA02 | 34A31    | 34A50ZZZ |
| ...    | ...      | ...      |

目标

| loc_id   | other data | stk    |
----------------------------------
| 34A032B1 | ...        | STKA01 |
| 34A3Z011 | ...        | STKA02 |
| 3DD23A41 | ...        | STKD01 |

我可以在这些行中找到的所有其他查询都在 BETWEEN 子句中使用数字、日期或时间,并且似乎通过将(从、到)范围分解为所有可能的值然后过滤掉额外的行。但是我需要使用字符串比较,将它们分解成所有可能的值是不可行的。

在我能找到的所有各种解决方案中,我最接近的是在 table a:

上添加一个自定义列
Table.SelectRows(
     table_b,
     (a) => Value.Compare([loc_id], table_b[from_loc]) = 1
     and Value.Compare([loc_id], table_b[to_loc]) = -1
)

这会 return 来自 table_b 的所有列,但是,当展开该列时,这些值都是空的。

这不是很具体“在 34A01 之后可以是任何字符串...”试图弄清楚你的系列是如何进行的。

但也许您可以使用 PQ 中的本机排序功能测试值如何“排序”。

添加具有 table.Select 行的自定义列:

= try Table.SelectRows(TableB, (t)=> t[from_loc]<=[loc_id] and t[to_loc] >= [loc_id])[stk]{0} otherwise null

用你的例子重现:

let
    TableB=Table.FromColumns(
        {{"STKA01","STKA02"},
        {"34A01","34A31"},
        {"34A30ZZZ","34A50ZZZ"}},
        type table[stk=text,from_loc=text,to_loc=text]),

    TableA=Table.FromColumns(
        {{"34A032B1","34A3Z011","3DD23A41"},
        {"...","...","..."}},
        type table[loc_id=text, other data=text]),

//determine where it sorts and return the stk
    #"Added Custom" = Table.AddColumn(#"TableA", "stk", each 
        try Table.SelectRows(TableB, (t)=> t[from_loc]<=[loc_id] and t[to_loc] >= [loc_id])[stk]{0} otherwise null)
in
    #"Added Custom"

注意:如果上述算法太慢,可能有更快的方法得到这些结果