Converter o atributo Teradata RESET WHEN para Amazon Redshift SQL - Recomendações da AWS

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:

  1. A função agregada SUM (balance) calcula a soma de todos os saldos de uma determinada conta em um determinado mês.

  2. Verificamos se o saldo em um determinado mês (para uma determinada conta) é maior que o saldo do mês anterior.

  3. 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.

  4. 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.

  5. 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

TarefaDescriçãoHabilidades 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

Referências

Ferramentas

Parceiros