Есть ли способ в presto / athena получить имена столбцов на основе условия и использовать их в group by?

#sql #database #amazon-web-services #presto #amazon-athena

#sql #База данных #amazon-web-services #presto #amazon-athena

Вопрос:

Есть ли способ в athena / presto получить имена столбцов на основе условия и использовать его в group by?

 SHOW COLUMNS FROM {table_name}
  

Этот запрос дает мне сведения о столбце. Но я хочу использовать только имена столбцов в каком-то другом запросе. Структура таблицы выглядит следующим образом

 name_of_service | cost | usage_date | user_123 | user_212 | user_342 | user_5832 | ...
  

И так далее. Существует около 500 столбцов

Рассматриваемый мной вариант использования выглядит примерно так —

 SELECT SUM(cost), {column_names_which_start_with_user}
FROM {db}
GROUP BY cost, {column_names_which_start_with_user}
  

Я не контролирую заполнение базы данных, и есть 100 столбцов, имена которых меняются каждый месяц. Есть ли способ сделать это?

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

1. there are 100s of columns whose names change every month … это, в сочетании с тем, что в ваших таблицах изначально 100 столбцов, заставляет меня думать, что, возможно, у вас не оптимальный дизайн базы данных. Возможно, вы захотите добавить некоторое описание того, как появились эти таблицы.

Ответ №1:

Существует виртуальная база information_schema данных, к которой можно запрашивать метаданные о таблицах и столбцах:

 SELECT column_name
FROM information_schema.columns
WHERE table_name = 'my_table'
AND column_name LIKE 'user_%'
  

К сожалению, вы не можете использовать это для создания списка столбцов запроса, потому что запросы не могут быть такими динамическими. Однако вы можете использовать его в своем клиентском коде для генерации нужного вам запроса.

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

1. Для меня это было бы более полезно без указанного table_name. Похоже, что он не работает только с column_name сам по себе, но можно добавить: (table_catalog = ‘OurCatalog’) И (table_schema = ‘OurSchema’)