在 BigQuery 中包含带有 ANY_VALUE 的空值

Inclusion of nulls with ANY_VALUE in BigQuery

我有一个 'vendors' table 看起来像这样...

**company itemKey itemPriceA itemPriceB**
companyA, 203913, 20, 10
companyA, 203914, 20, 20
companyA, 203915, 25, 5
companyA, 203916, 10, 10

每个公司可能有数百万行,我想查询它以返回每个公司的 itemPriceA 和 itemPriceB 之间的代表性增量。我不在乎我带回哪个增量,只要它不是 zero/null(比如第 2 行或第 4 行),所以我像这样使用 ANY_VALUE...

SELECT company
, ANY_VALUE(CASE WHEN (itemPriceA-itemPriceB)=0 THEN null ELSE (itemPriceA-itemPriceB) END)
FROM vendors
GROUP BY 1

它似乎有效,但我注意到 2 个句子似乎与 Google's documentation...

相矛盾

"Returns 当组中所有行的表达式为 NULL 时为 NULL。ANY_VALUE 的行为就好像指定了 RESPECT NULLS;表达式为 NULL 的行被考虑并且可以选择。"

If ANY_VALUE returns null “当组中 all 行的表达式为 NULL 时”它永远不会 return null companyA 正确(因为 4 行中只有 2 行为空)?但是第二句听起来确实会包含空行。

P.s。你可能想知道为什么我不简单地添加一个 WHERE 子句说“WHERE itemPriceA-itemPriceB>0”但是如果一家公司只有匹配的价格,我仍然希望该公司在我的 returned结果。

这是关于“any_value 如何处理空值”的解释。

与 any_value 总是 return 第一个值,如果有一个不同于 null 的值。

SELECT ANY_VALUE(fruit) as any_value
FROM UNNEST([null, "banana",null,null]) as fruit;

Return 如果所有行都具有空值,则为空。指的是这句话

“Returns NULL when expression is NULL for all rows in the group”

SELECT ANY_VALUE(fruit) as any_value
FROM UNNEST([null, null, null]) as fruit
 

Return 如果一个值为 null 并且您在 where 子句中指定,则为 null。指这些句子

“ANY_VALUE behaves as if RESPECT NULLS is specified; rows for which expression is NULL are considered and may be selected.”

SELECT ANY_VALUE(fruit) as any_value
FROM UNNEST(["apple", "banana", null]) as fruit
where fruit is null

始终取决于您使用的过滤器和 any_value 中的字段。

可以看到这个例子,return两行不为0。

SELECT ANY_VALUE(e).company, (itemPriceA-itemPriceB) as value
FROM `vendor` e
where (itemPriceA-itemPriceB)!=0
group by e.company