【问题标题】:How to get max value from row and column header in sql?如何从sql中的行和列标题中获取最大值?
【发布时间】:2021-01-19 08:32:09
【问题描述】:

我想从包含其他几个列的最大值的行中提取 ID 列的值和列标题,并创建一个简单的表,其中 ID 列、名称、max(value) 和列标题为 max(值)。

桌子看起来像这样。大约 160MM 行 x 50 列

 id | name  | A | B | C | D | E | ... 
----+-------+---+---+---+---+---+----
101 | name1 | 4 | 5 | 1 | 3 | 3 | ... 
102 | name2 | 3 | 1 | 2 | 4 | 2 | ... 
103 | name3 | 2 | 5 | 3 | 2 | 1 | ... 
104 | name4 | 1 | 3 | 4 | 1 | 6 | ... 
... | ..... | . | . | . | . | . | ... 

我希望查询输出如下:

 id | name  | max(value)  | col_name of max(value)|
----+-------+-------------+-----------------------+
101 | name1 | 5           | B                     |
102 | name2 | 4           | D                     |
103 | name3 | 5           | B                     | 
104 | name4 | 6           | E                     |
... | ..... | .           | .                     |

我正在使用此代码:

CREATE TEMP TABLE xx AS (
SELECT id, name,
   MAX(col) AS max(value),
   col_name AS col_name of max(value)
FROM (
SELECT id, name, A AS col, 'A' col_name FROM table
UNION
SELECT id, name, B , 'B' col_name FROM table
UNION
...)
GROUP BY id,name,
     col_name

但是,我得到了重复的值(~166MM 增加到~800MM 行)并且处理时间呈指数增长。我尝试了多种来自 google/stack overflow 的解决方案,但没有一个能帮助解决这个问题。

任何指导或建议都会有帮助。

问候, 大神

【问题讨论】:

  • 如果您不以某种方式聚合 ID,那么所有行都将重复:不同 ID 的数量 x 列的数量。考虑删除 ID 列或以某种方式聚合,例如从具有最大列值的记录中获取 id

标签: sql amazon-redshift


【解决方案1】:

你可以使用greatest如下:

select id, name, 
       greatest(a,b,c,d,e) as max_val,
       case greatest(a,b,c,d,e) 
            when a then 'A' when b then 'B' when c then 'C' when d then 'D'
       end as col_name_max
  from your_table

【讨论】:

  • @Shri 。 . .请注意:如果任何值为NULL,这将不起作用。如果这是一个问题,请提出一个问题。
  • 感谢您的来电。但是我的数据没有任何空值。因此应该工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 2019-07-13
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多