As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Converter o atributo Teradata RESET WHEN para Amazon Redshift SQL
Origem: data warehouse Teradata | Destino: Amazon Redshift | Tipo R: redefinir arquitetura |
Ambiente: produção | Tecnologias: análise; banco de dados; migração | Workload: todas as outras workloads |
Serviços da AWS: Amazon Redshift |
Resumo
RESET WHEN é um atributo do Teradata usado nas funções de janela analítica do SQL. É uma extensão do padrão ANSI SQL. RESET WHEN determina a partição na qual uma função de janela SQL opera com base em alguma condição especificada. Se a condição for avaliada como TRUE, uma nova subpartição dinâmica será criada dentro da partição da janela existente. Para obter mais informações sobre RESET WHEN, consulte a Documentação do Teradata
O Amazon Redshift não oferece suporte para RESET WHEN em funções de janela SQL. Para implementar essa funcionalidade, você precisa converter RESET WHEN para a sintaxe SQL nativa no Amazon Redshift e usar várias funções aninhadas. Esse padrão demonstra como você pode usar o atributo do Teradata RESET WHEN e como convertê-lo para a sintaxe SQL do Amazon Redshift.
Pré-requisitos e limitações
Pré-requisitos
Conhecimento básico do data warehouse Teradata e sua sintaxe SQL
Bom entendimento do Amazon Redshift e de sua sintaxe SQL
Arquitetura
Pilha de tecnologia de origem
Data warehouse Teradata
Pilha de tecnologias de destino
Amazon Redshift
Arquitetura
Para obter uma arquitetura de alto nível para migrar um banco de dados Teradata para o Amazon Redshift, consulte o padrão Migrar um banco de dados Teradata para o Amazon Redshift usando agentes de extração de dados do AWS SCT. A migração não converte automaticamente a frase RESET WHEN do Teradata em SQL do Amazon Redshift. Você pode converter essa extensão do Teradata seguindo as diretrizes na próxima seção.
Ferramentas
Código
Para ilustrar o conceito e a funcionalidade do RESET WHEN, considere a seguinte definição de tabela no Teradata:
create table systest.f_account_balance ( account_id integer NOT NULL, month_id integer, balance integer ) unique primary index (account_id, month_id);
Execute o código SQL a seguir para inserir dados de exemplo na tabela:
BEGIN TRANSACTION; Insert Into systest.f_account_balance values (1,1,60); Insert Into systest.f_account_balance values (1,2,99); Insert Into systest.f_account_balance values (1,3,94); Insert Into systest.f_account_balance values (1,4,90); Insert Into systest.f_account_balance values (1,5,80); Insert Into systest.f_account_balance values (1,6,88); Insert Into systest.f_account_balance values (1,7,90); Insert Into systest.f_account_balance values (1,8,92); Insert Into systest.f_account_balance values (1,9,10); Insert Into systest.f_account_balance values (1,10,60); Insert Into systest.f_account_balance values (1,11,80); Insert Into systest.f_account_balance values (1,12,10); END TRANSACTION;
A tabela de amostra tem os seguintes dados:
account_id | month_id | balance |
1 | 1 | 60 |
1 | 2 | 99 |
1 | 3 | 94 |
1 | 4 | 90 |
1 | 5 | 80 |
1 | 6 | 88 |
1 | 7 | 90 |
1 | 8 | 92 |
1 | 9 | 10 |
1 | 10 | 60 |
1 | 11 | 80 |
1 | 12 | 10 |
Para cada conta, suponhamos que você queira analisar a sequência de aumentos de saldo mensais consecutivos. Quando o saldo de um mês for menor ou igual ao saldo do mês anterior, o requisito é zerar o contador e reiniciá-lo.
Caso de uso do RESET WHEN do Teradata
Para analisar esses dados, o Teradata SQL usa uma função de janela com um agregado aninhado e uma frase RESET WHEN, da seguinte forma:
SELECT account_id, month_id, balance, ( ROW_NUMBER() OVER (PARTITION BY account_id ORDER BY month_id RESET WHEN balance <= SUM(balance) over (PARTITION BY account_id ORDER BY month_id ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) ) -1 ) as balance_increase FROM systest.f_account_balance ORDER BY 1,2;
Saída:
account_id | month_id | balance | balance_increase |
1 | 1 | 60 | 0 |
1 | 2 | 99 | 1 |
1 | 3 | 94 | 0 |
1 | 4 | 90 | 0 |
1 | 5 | 80 | 0 |
1 | 6 | 88 | 1 |
1 | 7 | 90 | 2 |
1 | 8 | 92 | 3 |
1 | 9 | 10 | 0 |
1 | 10 | 60 | 1 |
1 | 11 | 80 | 2 |
1 | 12 | 10 | 0 |
A consulta é processada da seguinte forma no Teradata:
A função agregada SUM (balance) calcula a soma de todos os saldos de uma determinada conta em um determinado mês.
Verificamos se o saldo em um determinado mês (para uma determinada conta) é maior que o saldo do mês anterior.
Se o saldo aumentar, rastreamos um valor de contagem cumulativa. Se a condição RESET WHEN avalia como falsa, o que significa que o saldo aumentou em meses sucessivos, a contagem continua aumentando.
A função analítica ordenada ROW_NUMBER () calcula o valor da contagem. Quando atingimos um mês cujo saldo é menor ou igual ao saldo do mês anterior, a condição RESET WHEN é avaliada como verdadeira. Nesse caso, iniciamos uma nova partição e ROW_NUMBER () reinicia a contagem a partir de 1. Usamos LINHAS ENTRE 1 ANTERIOR E 1 ANTERIOR para acessar o valor da linha anterior.
Subtraímos 1 para garantir que o valor da contagem comece com 0.
SQL equivalente ao Amazon Redshift
O Amazon Redshift não oferece suporte para RESET WHEN em uma função de janela SQL analítica. Para produzir o mesmo resultado, você deve reescrever o SQL Teradata usando a sintaxe SQL nativa do Amazon Redshift e subconsultas aninhadas, da seguinte forma:
SELECT account_id, month_id, balance, (ROW_NUMBER() OVER(PARTITION BY account_id, new_dynamic_part ORDER BY month_id) -1) as balance_increase FROM ( SELECT account_id, month_id, balance, prev_balance, SUM(dynamic_part) OVER (PARTITION BY account_id ORDER BY month_id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) As new_dynamic_part FROM ( SELECT account_id, month_id, balance, SUM(balance) over (PARTITION BY account_id ORDER BY month_id ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) as prev_balance, (CASE When balance <= prev_balance Then 1 Else 0 END) as dynamic_part FROM systest.f_account_balance ) A ) B ORDER BY 1,2;
Como o Amazon Redshift não oferece suporte a funções de janela aninhadas na cláusula SELECT de uma única instrução SQL, você deve usar duas subconsultas aninhadas.
Na subconsulta interna (alias A), um indicador de partição dinâmica (dynamic_part) é criado e preenchido. O dynamic_part é definido como 1 se o saldo de um mês for menor ou igual ao saldo do mês anterior; caso contrário, será definido como 0.
Na próxima camada (alias B), um atributo new_dynamic_part é gerado como resultado de uma função de janela SUM.
Finalmente, você adiciona new_dynamic_part como um novo atributo de partição (partição dinâmica) ao atributo de partição existente (account_id) e aplica a mesma função de janela ROW_NUMBER() que em Teradata (e menos um).
Depois dessas alterações, o Amazon Redshift SQL gera a mesma saída que o Teradata.
Épicos
Tarefa | Descrição | Habilidades necessárias |
---|---|---|
Criar sua função de janela Teradata. | Use agregados aninhados e a frase RESET WHEN de acordo com as suas necessidades. | SQL Developer |
Converter o código para Amazon Redshift SQL. | Para converter seu código, siga as diretrizes na seção “Ferramentas” desse padrão. | SQL Developer |
Executar o código no Amazon Redshift. | Crie sua tabela, carregue dados na tabela e execute seu código no Amazon Redshift. | SQL Developer |
Recursos relacionados
Referências
Frase RESET WHEN
(documentação da Teradata) Explicação do RESET WHEN
(estouro de pilha) Migre para o Amazon Redshift
(site da AWS) Migre um banco de dados Teradata para o Amazon Redshift usando agentes de extração de dados do AWS SCT (Recomendações da AWS)
Converta o atributo temporal Teradata NORMALIZE no Amazon Redshift SQL (Recomendações da AWS)
Ferramentas
Parceiros