Как получить максимальное значение из заголовка строки и столбца в sql?

#sql #amazon-redshift

#sql #amazon-redshift

Вопрос:

Я хочу извлечь значения и заголовок столбца столбца ID из строк, содержащих максимальные значения каждого из нескольких других столбцов, и создать простую таблицу со столбцом ID, именем, максимальным (значением) и заголовком столбца max (значение).

Таблица выглядит следующим образом. Примерно 160 мм строк 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
 

Однако я получаю повторяющиеся значения (~ 166 мм, увеличенные до ~ 800 мм строк) и экспоненциальное увеличение времени обработки. Я пробовал несколько решений из Google / stack overflow, но ни одно из них не помогло решить эту проблему.

Любые рекомендации или предложения действительно помогут.

С уважением, Шри

Комментарии:

1. Если вы каким-то образом не агрегируете идентификатор, все строки будут дублироваться: количество различных идентификаторов x количество столбцов. Рассмотрите возможность удаления столбца ID или агрегирования как-то, например, взятия id из записи с максимальным значением столбца

Ответ №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
 

Комментарии:

1. @Shri . . . Просто как примечание: это не сработает, если какое-либо из значений NULL . Если это проблема, задайте новый вопрос.

2. спасибо за приглашение. Однако мои данные не имеют нулевых значений. Следовательно, должно работать