Berechnungen mit numerischen Werten - AWS Clean Rooms

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 bezieht AWS Clean Rooms sich Berechnung auf binäre mathematische Operationen: Addition, Subtraktion, Multiplikation und Division. In diesem Abschnitt werden die erwarteten Ausgabetypen dieser Operationen beschrieben sowie die spezielle Formel, die verwendet wird, um die Genauigkeit und die Dezimalstellen zu ermitteln, wenn DECIMAL-Datentypen involviert sind.

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 AWS Clean Rooms -Konfigurationsparameter zu umgehen.

Weitere Informationen zu den Ergebnissen ähnlicher Berechnungen mit SQL-Funktionen finden Sie unter SQL-Funktionen in AWS Clean Rooms.

Ausgabetypen für Berechnungen

Angesichts der Anzahl der in AWS Clean Rooms unterstützten numerischen Datentypen zeigt die folgende Tabelle die erwarteten Rückgabetypen für Additions-, Subtraktions-, Multiplikations- und Divisionsoperationen. Die erste Spalte links in der Tabelle enthält dabei den ersten Operanden und die oberste Zeile den zweiten Operanden der Berechnung.

KLEINE GANZZAHL GANZZAHL GROSSE ZAHL DECIMAL FLOAT4 FLOAT8
KLEIN SMALLINT INTEGER BIGINT DECIMAL FLOAT8 FLOAT8
GANZZAHL INTEGER INTEGER BIGINT DECIMAL FLOAT8 FLOAT8
GROSSE ZAHL BIGINT BIGINT BIGINT DECIMAL FLOAT8 FLOAT8
DECIMAL DECIMAL DECIMAL DECIMAL DECIMAL FLOAT8 FLOAT8
FLOAT4 FLOAT8 FLOAT8 FLOAT8 FLOAT8 FLOAT4 FLOAT8
FLOAT8 FLOAT8 FLOAT8 FLOAT8 FLOAT8 FLOAT8 FLOAT8

Genauigkeit und Dezimalstellen der berechneten DECIMAL-Ergebnisse

In der folgenden Tabelle werden die Regeln für die Berechnung der Genauigkeit und der Dezimalstellen zusammengefasst, wenn mathematische Operationen DECIMAL-Ergebnisse ausgeben. 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

Die Spalten PRICEPAID und COMMISSION in der Tabelle SALES sind z. B. DECIMAL(8,2)-Spalten. Wenn Sie PRICEPAID durch COMMISSION dividieren (oder umgekehrt), sieht die Formel wie folgt aus:

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 stellt die allgemeine Regel für die Berechnung der Genauigkeit und der Dezimalstellen in Ergebnissen von Operationen dar, die mit DECIMAL-Werten sowie mit Satzoperatoren wie UNION, INTERSECT und EXCEPT oder Funktionen wie COALESCE und DECODE durchgeführt werden:

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

Eine DEC1-Tabelle mit einer DECIMAL(7,2)-Spalte wird z. B. mit einer DEC2-Tabelle mit einer DECIMAL(15,3)-Spalte verbunden, um eine DEC3-Tabelle zu erstellen. Das Schema von DEC3 zeigt, dass die Spalte zu einer NUMERIC(15,3)-Spalte wird.

select * from dec1 union select * from dec2;

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 die 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. DECIMAL-Daten mit einer Genauigkeit von 19 oder weniger werden als 64-Bit-Ganzzahlen gespeichert. DECIMAL-Daten mit einer Genauigkeit größer als 19 werden als 128-Bit-Ganzzahlen gespeichert. Die maximale Genauigkeit für alle DECIMAL-Werte beträgt 38, und es sind maximal 37 Dezimalstellen zulässig. Ü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 Spalte PRICEPAID in der SALES-Tabelle (eine Spalte DECIMAL (8,2)) umwandeln und ein DECIMAL-Ergebnis (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.

Numerische Berechnungen mit den Typen INTEGER und DECIMAL

Wenn einer der Operanden in einer Berechnung den INTEGER-Datentyp hat und der andere Operand DECIMAL ist, wird der INTEGER-Operand implizit in DECIMAL umgewandelt.

  • SMALLINT wird in DECIMAL (5,0) umgewandelt

  • INTEGER wird in DECIMAL (10,0) umgewandelt

  • BIGINT wird als DECIMAL (19,0) umgewandelt

Wenn Sie z. B. SALES.COMMISSION, eine DECIMAL(8,2)-Spalte, mit SALES.QTYSOLD, einer SMALLINT-Spalte multiplizieren, wird diese Berechnung umgewandelt in:

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