Berechnungen mit numerischen Werten - Amazon Redshift

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Berechnungen mit numerischen Werten

In diesem Kontext bezieht sich der Begriff Berechnungen auf binäre mathematische Operationen: Addition, Subtraktion, Multiplikation und Division. In diesem Abschnitt werden die erwarteten Rückgabetypen für diese Operationen sowie die spezifische Formel beschrieben, die angewendet wird, um Genauigkeit und Skalierung zu bestimmen, wenn es sich um DECIMAL Datentypen handelt.

Wenn bei der Verarbeitung von Abfragen numerische Werte berechnet werden, kann es vorkommen, dass eine Berechnung nicht möglich ist und die Abfrage einen numerischen Überlauffehler zurückgibt. Außerdem können Fälle auftreten, in denen die Dezimalstellen berechneter Werte variieren bzw. nicht den Erwartungen entsprechen. Bei manchen Operationen ist es möglich, diese Probleme durch explizite Umwandlungen (Typerweiterung) oder Amazon-Redshift-Konfigurationsparameter zu umgehen.

Hinweise zu den Ergebnissen ähnlicher Berechnungen mit SQL Funktionen finden Sie unterAggregationsfunktionen.

Ausgabetypen für Berechnungen

In der folgenden Tabelle werden die erwarteten Ausgabewerte für die Operationen Addition, Subtraktion, Multiplikation und Division unter Berücksichtigung der in Amazon Redshift unterstützten numerischen Datentypen aufgeführt. Die erste Spalte links in der Tabelle enthält dabei den ersten Operanden und die oberste Zeile den zweiten Operanden der Berechnung.

Operand 1 Operand 2 Rückgabetyp
INT2 INT2 INT2
INT2 INT4 INT4
INT2 INT8 INT8
INT2 DECIMAL DECIMAL
INT2 FLOAT4 FLOAT8
INT2 FLOAT8 FLOAT8
INT4 INT4 INT4
INT4 INT8 INT8
INT4 DECIMAL DECIMAL
INT4 FLOAT4 FLOAT8
INT4 FLOAT8 FLOAT8
INT8 INT8 INT8
INT8 DECIMAL DECIMAL
INT8 FLOAT4 FLOAT8
INT8 FLOAT8 FLOAT8
DECIMAL DECIMAL DECIMAL
DECIMAL FLOAT4 FLOAT8
DECIMAL FLOAT8 FLOAT8
FLOAT4 FLOAT8 FLOAT8
FLOAT8 FLOAT8 FLOAT8

Präzision und Umfang der berechneten Ergebnisse DECIMAL

In der folgenden Tabelle sind die Regeln für die Berechnung der Genauigkeit und des Maßstabs zusammengefasst, nach denen mathematische Operationen Ergebnisse liefernDECIMAL. In dieser Tabelle stellen p1 und s1 die Genauigkeit und die Dezimalstellen des ersten Operanden einer Berechnung und p2 und s2 die Genauigkeit und die Dezimalstellen des zweiten Operanden dar. (Unabhängig von diesen Berechnungen ist die maximale Genauigkeit eines Ergebnisses 38 und der maximale Wert für die Dezimalstellen 38.)

Operation Genauigkeit und Dezimalstellen in Ergebnissen
+ oder - Skalieren = max(s1,s2)

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

* Skalieren = s1+s2

Genauigkeit = p1+p2+1

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

Genauigkeit = p1-s1+ s2+scale

Beispielsweise sind die COMMISSION Spalten PRICEPAID und in der SALES Tabelle beide Spalten DECIMAL (8,2). Wenn Sie PRICEPAID durch COMMISSION (oder umgekehrt) dividieren, wird die Formel wie folgt angewendet:

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)

Die folgende Berechnung ist die allgemeine Regel für die Berechnung der resultierenden Genauigkeit und Skalierung für Operationen, die an DECIMAL Werten mit Mengenoperatoren wie UNIONINTERSECT, und EXCEPT oder Funktionen wie COALESCE und ausgeführt werdenDECODE:

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

Beispielsweise wird eine DEC1 Tabelle mit einer DECIMAL (7,2) Spalte mit einer DEC2 Tabelle mit einer DECIMAL (15,3) Spalte verknüpft, um eine DEC3 Tabelle zu erstellen. Das Schema von DEC3 zeigt, dass die Spalte zu einer NUMERIC (15,3) -Spalte wird.

create table dec3 as select * from dec1 union select * from dec2;

Ergebnis

select "column", type, encoding, distkey, sortkey from pg_table_def where tablename = 'dec3'; column | type | encoding | distkey | sortkey -------+---------------+----------+---------+--------- c1 | numeric(15,3) | none | f | 0

Im Beispiel oben wird die Formel wie folgt angewendet:

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

Hinweise für Divisionsoperationen

Bei Divisionsoperationen geben divide-by-zero Bedingungen Fehler zurück.

Für Dezimalstellen gilt ein Grenzwert von 100, nachdem die Genauigkeit und die Dezimalstellen berechnet wurden. Wenn im Ergebnis mehr als 100 Dezimalstellen berechnet wurden, wird das Ergebnis der Division wie folgt skaliert:

  • Genauigkeit = precision - (scale - max_scale)

  • Skalieren = max_scale

Wenn die berechnete Genauigkeit über dem maximalen Wert für die Genauigkeit (38) liegt, wird die Genauigkeit auf 38 reduziert, und für die Dezimalstellen wird die folgende Formel angewendet: max((38 + scale - precision), min(4, 100))

Überlaufbedingungen

Der Überlauf wird bei allen numerischen Berechnungen geprüft. DECIMALDaten mit einer Genauigkeit von 19 oder weniger werden als 64-Bit-Ganzzahlen gespeichert. DECIMALDaten mit einer Genauigkeit von mehr als 19 werden als 128-Bit-Ganzzahlen gespeichert. Die maximale Genauigkeit für alle DECIMAL Werte ist 38, und die maximale Skalierung ist 37. Überlauffehler treten auf, wenn ein Wert diese Grenzwerte überschreitet; diese gelten sowohl für Zwischenergebnissätze als auch für Endergebnissätze:

  • Ergebnisse von expliziten Umwandlungen in Überlauffehlern während der Laufzeit, wenn bestimmte Datenwerte nicht die Genauigkeit oder die Dezimalstellen aufweisen, die in der Umwandlungsfunktion angegeben sind. Sie können beispielsweise nicht alle Werte aus der PRICEPAID Spalte in der SALES Tabelle (eine Spalte DECIMAL (8,2)) umwandeln und ein Ergebnis DECIMAL (7,3) zurückgeben:

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

    Dieser Fehler tritt auf, weil einige der größeren Werte in der PRICEPAID Spalte nicht umgewandelt werden können.

  • Multiplikationsoperationen produzieren Ergebnisse, bei denen sich die Anzahl der Dezimalstellen aus der Summe der Dezimalstellen der einzelnen Operanden ergeben. Wenn beide Operanden z. B. 4 Dezimalstellen haben, hat das Ergebnis 8 Dezimalstellen, d. h. es bleiben nur 10 Stellen auf der linken Seite des Dezimaltrennzeichens übrig. Es kann daher relativ schnell passieren, dass Überlaufbedingungen bei der Multiplikation zweier großer Zahlen auftreten, die jeweils eine nicht unerheblich Anzahl von Dezimalstellen aufweisen.

    Der folgende Code führt beispielsweise zu einem Überlauf-Fehler:

    SELECT CAST(1 AS DECIMAL(38, 20)) * CAST(10 AS DECIMAL(38, 20)); ERROR: 128 bit numeric data overflow (multiplication)

    Sie können den Überlauf-Fehler umgehen, indem Sie Division statt Multiplikation benutzen. Verwenden Sie das folgende Beispiel, um durch 1 geteilt durch den ursprünglichen Divisor zu dividieren.

    SELECT CAST(1 AS DECIMAL(38, 20)) / (1 / CAST(10 AS DECIMAL(38, 20))); +----------+ | ?column? | +----------+ | 10 | +----------+

Numerische Berechnungen mit INTEGER und DECIMAL Typen

Wenn einer der Operanden in einer Berechnung einen INTEGER Datentyp und der andere Operand einen Datentyp hatDECIMAL, wird der INTEGER Operand implizit wie folgt umgewandelt: DECIMAL

  • INT2(SMALLINT) wird als (5,0) umgewandelt DECIMAL

  • INT4(INTEGER) wird als DECIMAL (10,0) gecastet

  • INT8(BIGINT) wird als DECIMAL (19,0) gecastet

Zum Beispiel, wenn Sie multiplizierenSALES. COMMISSION, eine Spalte DECIMAL (8,2) undSALES. QTYSOLD, eine SMALLINT Spalte, diese Berechnung lautet wie folgt:

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