Скажем, у меня есть запрос, который возвращает такие значения:
id type value
aaa 1a 10
aaa 1b 20
aaa 1c 7
bbb 2a 10
bbb 1a 5
Имеется> 50 миллионов строк и 240 возможных «типов». Я хочу сделать сводную таблицу, в которой есть одна строка для каждого id
, и каждый type
является собственным столбцом:
id 1a 1b 1c 2a
aaa 10 20 7
bbb 5 10
Я могу сделать это на SQL-сервере, но не знаю, как это сделать в Teradata. У меня слишком много столбцов, чтобы делать заявления CASE. Однако каждый отдельный type
находится в поле таблицы, если это поможет.
3 ответа
В Teradata SQL нет сводной функции. Здесь был дан ответ на аналогичный вопрос - teradata sql переносит несколько вхождений в дополнительные столбцы < / а>.
Чтобы наилучшим образом достичь желаемого, не выписывая 250 случаев вручную, вам следует использовать упорядоченные аналитические функции в виде цикла или набора. Попробуйте выполнить поиск по тегу loop в Teradata Developer Exchange - http://developer.teradata.com/tag/loop
Вот как я бы это сделал: используйте другой язык программирования (Python), чтобы повторить текст / предварительно созданный SQL и изменить его только две переменные 250 раз, от 1 до 250, и сгенерировать полный длинный sql. Повторяйте только часть между SELECT DISTINCT id
и последней FROM mytable
строкой:
SELECT DISTINCT
id
-- reiteration starts here
,(SELECT SUM(value) -- assuming you have unique types for every id
FROM (SELECT DISTINCT
id
,value
,type
FROM mytable
QUALIFY (RANK() OVER(PARTITION BY type ORDER BY id ASC))=1 -- variable 1
)
) AS type_1 -- variable 2
-- reiteration ends here
FROM mytable
Вы можете использовать этот питон:
for i in range(1,251):
print " \
,(SELECT SUM(value) -- assuming you have unique types for every id \
FROM (SELECT DISTINCT \
id \
,value \
,type \
FROM mytable \
QUALIFY (RANK() OVER(PARTITION BY type ORDER BY id ASC))=%d -- variable 1 \
) \
) AS type_%d -- variable 2 \
" % (i,i)
Функцию TD_UNPIVOT, добавленную в TD 14.10, можно найти в TD_SYSFNLIB.
SQL-команды PIVOT и UNPIVOT были добавлены в Teradata 16, и их можно найти в руководстве по функциям, операторам, выражениям и предикатам SQL. В настоящее время я не могу найти их в онлайн-руководстве, поэтому вам нужно будет загрузить PDF-файл с Teradata.com.
Новые функции TD 16 PIVOT и UNPIVOT
Используя функцию PIVOT в Teradata 16, это может выглядеть так (при условии, что ваши типы находятся в таблице с именем mytypetable):
SELECT
*
FROM
mytable PIVOT (SUM("value") FOR "type" IN (SELECT "Type" FROM mytypetable)) AS Temp_pivot
ORDER BY
id
Одним из недостатков является то, что вы не можете выбрать порядок столбцов.
Похожие вопросы
Связанные вопросы
Новые вопросы
teradata
Teradata - это система управления реляционными базами данных (RDBMS), способная поддерживать множество одновременно работающих пользователей с различных клиентских платформ. Teradata совместима со стандартом ANSI и полностью основана на параллельной архитектуре.