我想在每一行中找到一个范围内的列数,它具有非空和 >0 值...
选项 1
以下是 BigQuery 和通用的,足以适用于任意数量的列
SELECT *,
(SELECT COUNT(1)
FROM UNNEST(REGEXP_EXTRACT_ALL(
TO_JSON_STRING(t), r'"col\d+":(.*?)[,}]')
) value
WHERE NOT value IN ('null', '0')
) AS non_null_0_count
FROM `project.dataset.table` t
以上假设列的模式为 col1、col2、..、colNN
您可以使用您问题中的虚拟数据进行测试,如下所示
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 id, 1 col1, 0 col2, 0 col3, 0 col4, 0 col5 UNION ALL
SELECT 2, 4, 5, 0, 0, 0 UNION ALL
SELECT 3, NULL, NULL, NULL, NULL, NULL
)
SELECT *,
(SELECT COUNT(1)
FROM UNNEST(REGEXP_EXTRACT_ALL(
TO_JSON_STRING(t), r'"col\d+":(.*?)[,}]')
) value
WHERE NOT value IN ('null', '0')
) AS non_null_0_count
FROM `project.dataset.table` t
结果
Row id col1 col2 col3 col4 col5 non_null_0_count
1 1 1 0 0 0 0 1
2 2 4 5 0 0 0 2
3 3 null null null null null 0
选项 2
如果上述列模式不是真正的情况 - 这种方法仍然有效 - 请参见下面的示例 - 您只需要在正则表达式中枚举这些列
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 id, 1 abc, 0 xyz, 0 qwe, 0 asd, 0 zxc UNION ALL
SELECT 2, 4, 5, 0, 0, 0 UNION ALL
SELECT 3, NULL, NULL, NULL, NULL, NULL
)
SELECT *,
(SELECT COUNT(1)
FROM UNNEST(REGEXP_EXTRACT_ALL(
TO_JSON_STRING(t), r'"(?:abc|xyz|qwe|asd|zxc)":(.*?)[,}]')
) value
WHERE NOT value IN ('null', '0')
) AS non_null_0_count
FROM `project.dataset.table` t
结果为
Row id abc xyz qwe asd zxc non_null_0_count
1 1 1 0 0 0 0 1
2 2 4 5 0 0 0 2
3 3 null null null null null 0
选项 3
显然,最简单直接的选择是
#standardSQL
SELECT *,
(
SELECT COUNT(1)
FROM (
SELECT col1 col UNION ALL
SELECT col2 UNION ALL
SELECT col3 UNION ALL
SELECT col4 UNION ALL
SELECT col5
)
WHERE NOT col IS NULL AND col != 0
) AS non_null_0_count
FROM `project.dataset.table` t