如何在电源查询中执行 COALESCE?

Posted

技术标签:

【中文标题】如何在电源查询中执行 COALESCE?【英文标题】:How can I perform COALESCE in power query? 【发布时间】:2015-07-14 11:17:22 【问题描述】:

我有一个包含季度值的表,我需要添加一个新列,该列为我提供上一季度的最后一个非空值。例如

ID | Project  | Q1   | Q2   | Q3   | Q4   | Current Quarter Value  
1  | bal bal  | 23   | 32   | 34   | null | 34  
2  | cuz cuz  | 43   | 56   | null | null | 56  

【问题讨论】:

【参考方案1】:

在向表中添加自定义列时可以使用几个公式(可从“转换”功能区选项卡访问)。这是一个:

if [Q4] <> null then [Q4] else if [Q3] <> null then [Q3] else if [Q2] <> null then [Q2] else [Q1]

如果不想写这么多 if 语句,可以将列添加到列表中,过滤掉空值:

List.Last(List.Select([Q1], [Q2], [Q3], [Q4], each _ <> null))

【讨论】:

失败的原因是什么?您的查询是什么样的?您能否复制高级编辑器中显示的查询代码? 最终使用了嵌套的 if 解决方案...不实用,但它有效,谢谢! 我会使用List.Last(List.RemoveNulls([Q1], [Q2], [Q3], [Q4])) 如果我能给 +10,我会的。谢谢! @MikeHoney 为什么是List.Last?为什么最后,而不是第一个。如果不为空,不应该是 [Q1] 吗?或者如果它不为空,Last sellect Q4 不?【参考方案2】:

您可以尝试 null 合并运算符 (??)。以下两行都达到了返回ValueA的相同效果,除非它为null,在这种情况下返回ValueB

if ValueA <> null then ValueA else ValueB
ValueA ?? ValueB

适用于您的具体情况,必要的代码是:

[Q4] ?? [Q3] ?? [Q2] ?? [Q1]

请注意,空合并运算符是 Power Query 的 new addition。它尚未正式记录,not 可能在所有环境中都可用。

信息取自this blog post。

【讨论】:

【参考方案3】:

我认为有点晚了,但我也在寻找比以下更好的解决方案: List.First( List.RemoveNulls( list ) )

或默认值:

List.First(List.RemoveNulls(List.Combine list , defaultValue ) ) )

【讨论】:

【参考方案4】:

使用 List.RemoveNulls 让我感到困扰,因为它似乎做的工作超出了必要。

这是一个似乎避免处理整个列表的函数,除了第一个非空项目:

coalesce = each List.First(List.RemoveFirstN(_, each _ = null), null)

【讨论】:

以上是关于如何在电源查询中执行 COALESCE?的主要内容,如果未能解决你的问题,请参考以下文章

Coalesce 函数如何处理数据类型

如何在本机查询中使用 NVL 或 COALESCE 获取 Spring Data JPA 中的值列表

如何在 WHERE 子句中优化使用 COALESCE()?

抽象模式类型“COALESCE”未知

如何在 Laravel 5.1 中编写这个(左连接、子查询)?

如何计算在电源查询中具有其他行作为输入的东西?