在bigquery中,有没有一种方法可以执行“ L”操作?说哪里:
+----------------+---------------+----------------+
| COL1 | COL2 | FOO |
+----------------+---------------+----------------+
| identif11 | BAR | VALUE1 |
| identif22 | FOO | VALUE2 |
+----------------+---------------+----------------+
如果(COL2)中的值与(FOO)中的(FOO)返回值匹配,并且可以将其添加到新列中。
我是SQL方面的新秀,我可以在python中做到这一点,但是我正在处理数百万行的数据集,因此我需要更强大的功能
L-operator(COL1,FOO)应该在第二行中返回VALUE2。
答案 0 :(得分:3)
以下是用于BigQuery标准SQL
选项1
#standardSQL
SELECT col1, col2, foo, bar,
CASE col2
WHEN 'BAR' THEN bar
WHEN 'FOO' THEN foo
END L
FROM `project.dataset.table` t
您可以使用问题中的示例数据进行测试,操作
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'identif11' col1, 'BAR' col2, 'VALUE1' foo, 'VALUE3' bar UNION ALL
SELECT 'identif22', 'FOO', 'VALUE2', 'VALUE4'
)
SELECT col1, col2, foo, bar,
CASE col2
WHEN 'BAR' THEN bar
WHEN 'FOO' THEN foo
END L
FROM `project.dataset.table` t
有结果
Row col1 col2 foo bar L
1 identif11 BAR VALUE1 VALUE3 VALUE3
2 identif22 FOO VALUE2 VALUE4 VALUE2
选项2
您可以在上面进行一些“重构”-通过使用下面的示例中的SQL UDF
#standardSQL
CREATE TEMP FUNCTION L(val STRING, t ANY TYPE) AS (
CASE val
WHEN 'BAR' THEN t.bar
WHEN 'FOO' THEN t.foo
END
);
WITH `project.dataset.table` AS (
SELECT 'identif11' col1, 'BAR' col2, 'VALUE1' foo, 'VALUE3' bar UNION ALL
SELECT 'identif22', 'FOO', 'VALUE2', 'VALUE4' UNION ALL
SELECT 'identif22', 'AAA', 'VALUE2', 'VALUE4'
)
SELECT col1, col2, foo, bar, L(col2, t) L
FROM `project.dataset.table` t
有结果
Row col1 col2 foo bar L
1 identif11 BAR VALUE1 VALUE3 VALUE3
2 identif22 FOO VALUE2 VALUE4 VALUE2
3 identif22 AAA VALUE2 VALUE4 null
选项3
最后,不需要预先知道并在代码中显式引用列名的版本
#standardSQL
CREATE TEMP FUNCTION L(val STRING, t ANY TYPE) AS (
REGEXP_EXTRACT(
TO_JSON_STRING(t),
CONCAT(r'(?i)"', val, '":"?([^"}]+)"?')
)
);
SELECT col1, col2, foo, bar, L(col2, t) L
FROM `project.dataset.table` t
注意:第3个选项尚未经过全面测试,可能会有一些极端情况-但对于示例数据中的简单情况-应该可以很好地工作