См. Ниже пример для BigQuery Standard SQL - он работает для любого числа столбцов и не требует явного вызова / использования имен столбцов
#standardSQL
WITH `project.dataset.mytable` AS (
SELECT 1 AS col1, 2 AS col2, 3 AS col3, 4 AS col4 UNION ALL
SELECT 7,6,5,4 UNION ALL
SELECT -1, 11, 5, 8
)
SELECT
MIN(CAST(value AS INT64)) AS min_value,
MAX(CAST(value AS INT64)) AS max_value
FROM `project.dataset.mytable` t,
UNNEST(REGEXP_EXTRACT_ALL(TO_JSON_STRING(t), r'":(.*?)(?:,"|})')) value
с результатом
Row min_value max_value
1 -1 11
Примечание: если ваши столбцы имеют тип данных STRING - вы должны удалить CAST ... AS INT64
или, если они имеют FLOAT64 - заменить INT64 на FLOAT64 в функции CAST
Update
Ниже приведена опция для получения MIN / Max для каждого столбца и представления результата в виде массива соответствующих значений в виде списка соответствующих значений в порядке столбцов
#standardSQL
WITH `project.dataset.mytable` AS (
SELECT 1 AS col1, 2 AS col2, 3 AS col3, 14 AS col4 UNION ALL
SELECT 7,6,5,4 UNION ALL
SELECT -1, 11, 5, 8
), temp AS (
SELECT pos, MIN(CAST(value AS INT64)) min_value, MAX(CAST(value AS INT64)) max_value
FROM `project.dataset.mytable` t,
UNNEST(REGEXP_EXTRACT_ALL(TO_JSON_STRING(t), r'":(.*?)(?:,"|})')) value WITH OFFSET pos
GROUP BY pos
)
SELECT 'min_values' stats, TO_JSON_STRING(ARRAY_AGG(min_value ORDER BY pos)) vals FROM temp UNION ALL
SELECT 'max_values', TO_JSON_STRING(ARRAY_AGG(max_value ORDER BY pos)) FROM temp
с результатом как
Row stats vals
1 min_values [-1,2,3,4]
2 max_values [7,11,5,14]
Надеюсь, это то, что вы все еще можете применить к любой вашей конечной цели