从具有列名称 (SQL) 的行中获取 MAX
Get MAX from row with column name (SQL)
对不起,如果我的问题很简单,但我花了一天时间谷歌搜索仍然无法弄清楚如何解决这个问题:
我table喜欢:
userId A B C D E
1 5 0 2 3 2
2 3 2 0 7 3
我需要每行的每个 MAX 列名称:
userId MAX
1 A
2 D
所有想法将不胜感激!谢谢!
我使用 Google Big Query,所以据我所知,我的可能性与 MySQL 不同,但如果您有 MySQL 方式的想法,我会尝试翻译。
您可以使用 GREATEST
:
SELECT userid, CASE GREATEST(A,B,C,D,E)
WHEN A THEN 'A'
WHEN B THEN 'B'
WHEN C THEN 'C'
WHEN D THEN 'D'
WHEN E THEN 'E'
END AS MAX
FROM TableName
结果:
userId MAX
1 A
2 D
以下适用于 BigQuery 标准 SQL
#standardSQL
SELECT *,
( SELECT key
FROM UNNEST(REGEXP_EXTRACT_ALL(TO_JSON_STRING(t), r'".*?":[^,}]*')) kv,
UNNEST([STRUCT(TRIM(SPLIT(kv, ':')[OFFSET(0)], '"') AS key, SAFE_CAST(SPLIT(kv, ':')[OFFSET(1)] AS INT64) AS value)])
WHERE key != 'userId'
ORDER BY value DESC
LIMIT 1
) max_column
FROM `project.dataset.table` t
如果应用到问题中的样本数据,如下例
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 userId, 5 A, 0 B, 2 C, 3 D, 2 E UNION ALL
SELECT 2, 3, 2, 0, 7, 3 UNION ALL
SELECT 3, 1, 2, NULL, 4, 5
)
SELECT *,
( SELECT key
FROM UNNEST(REGEXP_EXTRACT_ALL(TO_JSON_STRING(t), r'".*?":[^,}]*')) kv,
UNNEST([STRUCT(TRIM(SPLIT(kv, ':')[OFFSET(0)], '"') AS key, SAFE_CAST(SPLIT(kv, ':')[OFFSET(1)] AS INT64) AS value)])
WHERE key != 'userId'
ORDER BY value DESC
LIMIT 1
) max_column
FROM `project.dataset.table` t
输出是
Row userId A B C D E max_column
1 1 5 0 2 3 2 A
2 2 3 2 0 7 3 D
3 3 1 2 null 4 5 E
对不起,如果我的问题很简单,但我花了一天时间谷歌搜索仍然无法弄清楚如何解决这个问题:
我table喜欢:
userId A B C D E
1 5 0 2 3 2
2 3 2 0 7 3
我需要每行的每个 MAX 列名称:
userId MAX
1 A
2 D
所有想法将不胜感激!谢谢! 我使用 Google Big Query,所以据我所知,我的可能性与 MySQL 不同,但如果您有 MySQL 方式的想法,我会尝试翻译。
您可以使用 GREATEST
:
SELECT userid, CASE GREATEST(A,B,C,D,E)
WHEN A THEN 'A'
WHEN B THEN 'B'
WHEN C THEN 'C'
WHEN D THEN 'D'
WHEN E THEN 'E'
END AS MAX
FROM TableName
结果:
userId MAX
1 A
2 D
以下适用于 BigQuery 标准 SQL
#standardSQL
SELECT *,
( SELECT key
FROM UNNEST(REGEXP_EXTRACT_ALL(TO_JSON_STRING(t), r'".*?":[^,}]*')) kv,
UNNEST([STRUCT(TRIM(SPLIT(kv, ':')[OFFSET(0)], '"') AS key, SAFE_CAST(SPLIT(kv, ':')[OFFSET(1)] AS INT64) AS value)])
WHERE key != 'userId'
ORDER BY value DESC
LIMIT 1
) max_column
FROM `project.dataset.table` t
如果应用到问题中的样本数据,如下例
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 userId, 5 A, 0 B, 2 C, 3 D, 2 E UNION ALL
SELECT 2, 3, 2, 0, 7, 3 UNION ALL
SELECT 3, 1, 2, NULL, 4, 5
)
SELECT *,
( SELECT key
FROM UNNEST(REGEXP_EXTRACT_ALL(TO_JSON_STRING(t), r'".*?":[^,}]*')) kv,
UNNEST([STRUCT(TRIM(SPLIT(kv, ':')[OFFSET(0)], '"') AS key, SAFE_CAST(SPLIT(kv, ':')[OFFSET(1)] AS INT64) AS value)])
WHERE key != 'userId'
ORDER BY value DESC
LIMIT 1
) max_column
FROM `project.dataset.table` t
输出是
Row userId A B C D E max_column
1 1 5 0 2 3 2 A
2 2 3 2 0 7 3 D
3 3 1 2 null 4 5 E