在 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
我有一个 '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