Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Convertire la funzionalità Teradata RESET WHEN in Amazon Redshift SQL
Creato da Po Hong (AWS)
Riepilogo
RESET WHEN è una funzionalità di Teradata utilizzata nelle funzioni analitiche delle finestre SQL. È un'estensione dello standard ANSI SQL. RESET WHEN determina la partizione su cui opera una funzione di finestra SQL in base a una condizione specificata. Se la condizione restituisce TRUE, viene creata una nuova sottopartizione dinamica all'interno della partizione di finestra esistente. Per ulteriori informazioni su RESET WHEN, consultate la documentazione di Teradata.
Amazon Redshift non supporta RESET WHEN nelle funzioni delle finestre SQL. Per implementare questa funzionalità, devi convertire RESET WHEN nella sintassi SQL nativa in Amazon Redshift e utilizzare più funzioni annidate. Questo modello dimostra come utilizzare la funzionalità Teradata RESET WHEN e come convertirla nella sintassi SQL di Amazon Redshift.
Prerequisiti e limitazioni
Prerequisiti
Conoscenza di base del data warehouse Teradata e della sua sintassi SQL
Buona conoscenza di Amazon Redshift e della sua sintassi SQL
Architettura
Stack tecnologico di origine
Data warehouse Teradata
Stack tecnologico Target
Amazon Redshift
Architettura
Per un'architettura di alto livello per la migrazione di un database Teradata ad Amazon Redshift, consulta lo schema Migrare un database Teradata su Amazon Redshift utilizzando gli agenti di estrazione dati AWS SCT. La migrazione non converte automaticamente la frase Teradata RESET WHEN in Amazon Redshift SQL. Puoi convertire questa estensione Teradata seguendo le linee guida nella sezione successiva.
Strumenti
Codice
Per illustrare il concetto di RESET WHEN, si consideri la seguente definizione di tabella in Teradata:
create table systest.f_account_balance
( account_id integer NOT NULL,
month_id integer,
balance integer )
unique primary index (account_id, month_id);
Esegui il seguente codice SQL per inserire dati di esempio nella tabella:
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;
La tabella di esempio contiene i seguenti dati:
account_id | month_id | equilibrio |
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 |
Per ogni account, supponiamo che tu voglia analizzare la sequenza di aumenti mensili consecutivi del saldo. Quando il saldo di un mese è inferiore o uguale al saldo del mese precedente, è necessario azzerare il contatore e riavviare il sistema.
Caso d'uso Teradata RESET WHEN
Per analizzare questi dati, Teradata SQL utilizza una funzione finestra con un aggregato annidato e una frase RESET WHEN, come segue:
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;
Output:
account_id | id_mese | equilibrio | 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 |
La query viene elaborata come segue in Teradata:
La funzione di aggregazione SUM (saldo) calcola la somma di tutti i saldi di un determinato conto in un determinato mese.
Controlliamo se il saldo in un determinato mese (per un determinato account) è maggiore del saldo del mese precedente.
Se il saldo aumenta, tracciamo un valore di conteggio cumulativo. Se la condizione RESET WHEN risulta falsa, il che significa che il saldo è aumentato nei mesi successivi, continuiamo ad aumentare il conteggio.
La funzione analitica ordinata ROW_NUMBER () calcola il valore del conteggio. Quando raggiungiamo un mese il cui saldo è inferiore o uguale al saldo del mese precedente, la condizione RESET WHEN risulta vera. In tal caso, iniziamo una nuova partizione e ROW_NUMBER () riavvia il conteggio da 1. Utilizziamo ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING per accedere al valore della riga precedente.
Sottraiamo 1 per assicurarci che il valore del conteggio inizi con 0.
SQL equivalente ad Amazon Redshift
Amazon Redshift non supporta la frase RESET WHEN in una funzione di finestra analitica SQL. Per ottenere lo stesso risultato, è necessario riscrivere Teradata SQL utilizzando la sintassi SQL nativa di Amazon Redshift e sottoquery annidate, come segue:
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;
Poiché Amazon Redshift non supporta le funzioni di finestra annidata nella clausola SELECT di una singola istruzione SQL, è necessario utilizzare due sottoquery annidate.
Nella sottoquery interna (alias A), viene creato e popolato un indicatore di partizione dinamica (dynamic_part). dynamic_part è impostato su 1 se il saldo di un mese è inferiore o uguale al saldo del mese precedente; in caso contrario, è impostato su 0.
Nel livello successivo (alias B), viene generato un attributo new_dynamic_part come risultato di una funzione della finestra SUM.
Infine, aggiungete new_dynamic_part come nuovo attributo di partizione (partizione dinamica) all'attributo di partizione esistente (account_id) e applicate la stessa funzione di finestra ROW_NUMBER () di Teradata (e meno una).
Dopo queste modifiche, Amazon Redshift SQL genera lo stesso output di Teradata.
Epiche
Attività | Descrizione | Competenze richieste |
---|---|---|
Crea la tua funzione di finestra Teradata. | Usa gli aggregati annidati e la frase RESET WHEN in base alle tue esigenze. | SQL Developer |
Converti il codice in Amazon Redshift SQL. | Per convertire il codice, segui le linee guida nella sezione «Strumenti» di questo modello. | SQL Developer |
Esegui il codice in Amazon Redshift. | Crea la tua tabella, carica i dati nella tabella ed esegui il codice in Amazon Redshift. | SQL Developer |
Risorse correlate
Riferimenti
RESET WHEN Phrase
(documentazione Teradata) Spiegazione RESET WHEN
(Stack Overflow) Esegui la migrazione ad Amazon Redshift
(sito web AWS)
Strumenti
Partner