#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. спасибо за приглашение. Однако мои данные не имеют нулевых значений. Следовательно, должно работать