Найти min max для всех столбцов без перечисления каждого имени столбца в SQL - PullRequest
0 голосов
/ 29 января 2019

У меня есть таблица SQL (на самом деле таблица BigQuery), которая содержит огромное количество столбцов (более тысячи).Я хочу быстро найти минимальное и максимальное значение каждого столбца.Есть ли способ сделать это?

Невозможно перечислить все столбцы.В поисках способов сделать что-то вроде

SELECT MAX(*) FROM mytable;

и затем запустить

SELECT MIN(*) FROM mytable;

Я не смог Google способ сделать это.Не уверен, что это даже возможно.

Например, если моя таблица имеет следующую схему:

col1  col2  col3  .... col1000

(скажем, макс) запрос должен вернуть

Row  col1  col2 col3  ... col1000
1    3     18   0.6   ... 45

и запрос min должен возвращать (скажем)

Row  col1  col2 col3  ... col1000
1    -5     4   0.1   ... -5

Цифры приведены только для иллюстрации.Имена столбцов могут быть разными строками и не могут быть легко написаны в сценарии.

1 Ответ

0 голосов
/ 29 января 2019

См. Ниже пример для 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]    

Надеюсь, это то, что вы все еще можете применить к любой вашей конечной цели

...