繁体   English   中英

查找所有列的最小最大值,而不在SQL中列出每个列名称

[英]Find min max over all columns without listing down each column name in SQL

我有一个SQL表(实际上是一个BigQuery表),它有很多列(超过一千)。 我想快速找到每列的最小值和最大值。 有没有办法做到这一点?

我不可能列出所有列。 寻找做某事的方法

SELECT MAX(*) FROM mytable;

然后跑

SELECT MIN(*) FROM mytable;

我无法以谷歌的方式做到这一点。 不确定是否可能。

例如,如果我的表具有以下模式:

col1  col2  col3  .... col1000

(例如,max)查询应该返回

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

并且min查询应该返回(比如说)

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

这些数字只是为了说明。 列名可以是不同的字符串,不容易编写脚本。

请参阅下面的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 - 在CAST功能中将INT64替换为FLOAT64

更新

下面是获取每列的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]    

希望这是你仍然可以适用于你的最终目标

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM