提问人:dougp 提问时间:11/4/2023 最后编辑:dougp 更新时间:11/7/2023 访问量:61
Power Query/PowerBI 中的条件联接
Conditional Join in Power Query/PowerBI
问:
我需要根据一个数据集中的值与另一个数据集中的值之间的值来连接两个数据集。
数据集 1 (foo):
编号 | 瓦尔 |
---|---|
一个 | 3 |
b | 7 |
c | 13 |
数据集 2 (bar):
描述 | beginval | 恩德瓦尔 |
---|---|---|
x | 2 | 5 |
y | 8 | 14 |
z | 17 | 20 |
在SQL中,我会写:
select bar.descr
, bar.beginval
, bar.endval
, foo.id
from bar
left outer join foo on foo.val between bar.beginval and bar.endval
这将产生:
描述 | beginval | 恩德瓦尔 | 编号 |
---|---|---|---|
x | 2 | 5 | 一个 |
y | 8 | 14 | c |
z | 17 | 20 | (空) |
但是,由于数据集不是来自同一源,并且源不一定是 SQL 数据库,因此我无法编写 SQL 来在 Power BI 中执行此操作。
在 Power BI 中,我看到我可以联接一列 = 一列。我没有看到加入范围的能力。这是否适用于 DAX 或查询编辑器中的某种类型的操作?
更新
在我的具体案例中,数据集 2 是一个电子表格,数据集 1 来自数据集市。如果我在 Power Query 编辑器中使用 M 联接数据集(如 Davide Bacci 建议的那样),它会强制结果进入导入模式。Power BI 变得无响应,当我注意到它有 2000 万行进入下载时,我最终不得不使用任务管理器来杀死 Power BI,而下载可能只有几亿行。
有没有办法在 DAX 中执行此操作,以便我可以将数据集市部分保留在直接查询模式下?或者这是否仍然会导致某个地方缓慢、消耗资源的加入?(请记住,“慢”是相对的,主要问题是所需的计算资源量。我目前正在 IBM Cognos Analytics 中执行此操作,唯一的问题是报告可能需要大约 18 分钟才能运行。但至少我不需要将 400 GB 的数据集从笔记本电脑上传到报表服务器。
我可以问一些 A-B 问题吗?我很高兴得知生态系统中还有其他工具可以帮助解决这个问题。只要它不是 Power Automate。这在这里是被禁止的。
答:
在 Power Query 中:
一个:
B:
添加列并展开:
Table.SelectRows(B, (x)=> x[val] >= [beginval] and x[val] <= [endval])
let
Source = Excel.CurrentWorkbook(){[Name="Table3"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"descr", type text}, {"beginval", Int64.Type}, {"endval", Int64.Type}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each Table.SelectRows(B, (x)=> x[val] >= [beginval] and x[val] <= [endval])),
#"Expanded Custom" = Table.ExpandTableColumn(#"Added Custom", "Custom", {"id"}, {"id"})
in
#"Expanded Custom"
评论
Table.SelectRows()
上一个:将多列分成行
评论