View a markdown version of this page

Calcoli con valori numerici - AWS Clean Rooms

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

Calcoli con valori numerici

In AWS Clean Rooms, il calcolo si riferisce a operazioni matematiche binarie: addizione, sottrazione, moltiplicazione e divisione. Questa sezione descrive i tipi restituiti previsti per queste operazioni, nonché la formula specifica che viene applicata per determinare la precisione e la scala quando sono coinvolti tipi di dati DECIMAL.

Quando valori numerici vengono calcolati durante l'elaborazione di query, potresti affrontare casi in cui il calcolo è impossibile e la query restituisce un errore dell'overflow numerico. Potresti anche riscontrare casi in cui la scala di valori calcolati varia o è imprevista. Per alcune operazioni, è possibile usare il casting esplicito (promozione tipo) o i parametri di configurazione AWS Clean Rooms per risolvere questi problemi.

Per informazioni sui risultati di calcoli simili con funzioni SQL, consultare AWS Clean Rooms Funzioni Spark SQL.

Tipi restituiti per i calcoli

Dato il set di tipi di dati numerici supportati in AWS Clean Rooms, la tabella seguente mostra i tipi di rendimento previsti per le operazioni di addizione, sottrazione, moltiplicazione e divisione. La prima colonna sul lato sinistro della tabella rappresenta il primo operando nel calcolo e la riga in alto rappresenta il secondo operando.

Operando 1 Operando 2 Tipo restituito
SMALLINT o SHORT SMALLINT o SHORT SMALLINT o SHORT
SMALLINT o SHORT INTEGER INTEGER
SMALLINT o SHORT BIGINT BIGINT
SMALLINT o SHORT DECIMAL DECIMAL
SMALLINT o SHORT FLOAT4 FLOAT8
SMALLINT o SHORT FLOAT8 FLOAT8
INTEGER INTEGER INTEGER
INTEGER BIGINT o LONG BIGINT o LONG
INTEGER DECIMAL DECIMAL
INTEGER FLOAT4 FLOAT8
INTEGER FLOAT8 FLOAT8
BIGINT o LONG BIGINT o LONG BIGINT o LONG
BIGINT o LONG DECIMAL DECIMAL
BIGINT o LONG FLOAT4 FLOAT8
BIGINT o LONG FLOAT8 FLOAT8
DECIMAL DECIMAL DECIMAL
DECIMAL FLOAT4 FLOAT8
DECIMAL FLOAT8 FLOAT8
FLOAT4 FLOAT8 FLOAT8
FLOAT8 FLOAT8 FLOAT8

Precisione e scala di risultati DECIMAL calcolati

La tabella seguente riassume le regole per la scala e la precisione risultanti dal calcolo quando operazioni matematiche restituiscono risultati DECIMAL. In questa tabella, p1 e s1 rappresentano la precisione e la scala del primo operando in un calcolo. p2e s2 rappresentano la precisione e la scala del secondo operando. (Indipendentemente da questi calcoli, la precisione del risultato massima è 38 e la scala del risultato massima è 38.)

Operation Scala e precisione del risultato
+ oppure - Dimensionare = max(s1,s2)

Precisione = max(p1-s1,p2-s2)+1+scale

* Dimensionare = s1+s2

Precisione = p1+p2+1

/ Dimensionare = max(4,s1+p2-s2+1)

Precisione = p1-s1+ s2+scale

Ad esempio, le colonne PRICEPAID e COMMISSION nella tabella SALES sono entrambe colonne DECIMAL(8,2). Se dividi PRICEPAID per COMMISSION (o viceversa), la formula è applicata come segue:

Precision = 8-2 + 2 + max(4,2+8-2+1) = 6 + 2 + 9 = 17 Scale = max(4,2+8-2+1) = 9 Result = DECIMAL(17,9)

Il calcolo seguente è la regola generale per il calcolo della scala e della precisione risultanti per le operazioni eseguite su valori DECIMAL con operatori impostati come UNION, INTERSECT ed EXCEPT o funzioni come COALESCE e DECODE:

Scale = max(s1,s2) Precision = min(max(p1-s1,p2-s2)+scale,19)

Ad esempio, una tabella DEC1 con una colonna DECIMAL(7,2) viene unita con una tabella DEC2 con una colonna DECIMAL(15,3) per creare una tabella DEC3. Lo schema di DEC3 mostra che la colonna diventa una colonna NUMERIC(15,3).

select * from dec1 union select * from dec2;

Nell'esempio sopra, la formula è applicata come segue:

Precision = min(max(7-2,15-3) + max(2,3), 19) = 12 + 3 = 15 Scale = max(2,3) = 3 Result = DECIMAL(15,3)

Note sulle operazioni di divisione

Per le operazioni di divisione, le condizioni di divisione per zero restituiscono errori.

Il limite di scala di 100 è applicato dopo aver calcolato la precisione e la scala. Se la scala del risultato calcolata è maggiore di 100, i risultati della divisione vengono scalati come segue:

  • Precisione = precision - (scale - max_scale)

  • Dimensionare = max_scale

Se la precisione calcolata supera la precisione massima (38), la precisione viene ridotta a 38 e la scala diventa il risultato di: max(38 + scale - precision), min(4, 100))

Condizioni di overflow

L'overflow viene controllato per tutti i calcoli numerici. I dati DECIMAL con una precisione di 19 o inferiore vengono memorizzati come interi a 64 bit. I dati DECIMAL con una precisione superiore a 19 vengono memorizzati come interi a 128 bit. La precisione massima per tutti i valori DECIMAL è 38 e la scala massima è 37. Gli errori dell'overflow si verificano quando un valore supera questi limiti, che si applicano agli insiemi dei risultati finali e intermedi:

  • Il casting esplicito genera errori di overflow di runtime quando valori di dati specifici non corrispondono alla precisione o alla scala richieste specificate dalla funzione cast. Ad esempio, non puoi eseguire il cast di tutti i valori della colonna PRICEPAID nella tabella SALES (una colonna DECIMAL (8,2)) e restituire un risultato DECIMAL (7,3):

    select pricepaid::decimal(7,3) from sales; ERROR: Numeric data overflow (result precision)

    Questo errore si verifica perché non è possibile eseguire il cast di alcuni dei valori più grandi nella colonna PRICEPAID.

  • Le operazioni di moltiplicazione producono risultati in cui la scala del risultato è la somma della scala di ciascun operando. Se entrambi gli operando hanno una scala di 4, ad esempio, la scala del risultato è 8, lasciando solo 10 cifre per il lato sinistro del punto decimale. Pertanto, è relativamente facile incorrere in condizioni di overflow quando si moltiplicano due grandi numeri che possiedono entrambi una scala significativa.

Calcoli numerici con tipi INTEGER e DECIMAL

Quando uno degli operandi di un calcolo ha un tipo di dati INTEGER e l'altro operando è DECIMAL, l'operando INTEGER viene convertito implicitamente come DECIMAL.

  • SMALLINT o SHORT viene espresso come DECIMAL (5,0)

  • INTEGER viene espresso come DECIMAL (10,0)

  • BIGINT o LONG viene espresso come DECIMAL (19,0)

Ad esempio, se moltiplichi SALES.COMMISSION una colonna DECIMAL (8,2) e una colonna SMALLINT SALES.QTYSOLD, questo calcolo viene espresso come:

DECIMAL(8,2) * DECIMAL(5,0)