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"
注意:如果上述算法太慢,可能有更快的方法得到这些结果
我有一个导入查询 (table a) 和一个导入的 Excel 文件 (table b),其中包含我正在尝试匹配的记录。
我正在寻找一种方法来在 M:
中复制这种类型的 SQLSELECT 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"
注意:如果上述算法太慢,可能有更快的方法得到这些结果