Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Perhitungan dengan nilai numerik
Dalam AWS Clean Rooms, komputasi mengacu pada operasi matematika biner: penambahan, pengurangan, perkalian, dan pembagian. Bagian ini menjelaskan jenis pengembalian yang diharapkan untuk operasi ini, serta rumus spesifik yang diterapkan untuk menentukan presisi dan skala ketika tipe data DECIMAL terlibat.
Ketika nilai numerik dihitung selama pemrosesan kueri, Anda mungkin menemukan kasus di mana perhitungan tidak mungkin dan kueri mengembalikan kesalahan luapan numerik. Anda mungkin juga mengalami kasus di mana skala nilai yang dihitung bervariasi atau tidak terduga. Untuk beberapa operasi, Anda dapat menggunakan casting eksplisit (promosi jenis) atau parameter AWS Clean Rooms konfigurasi untuk mengatasi masalah ini.
Untuk informasi tentang hasil perhitungan serupa dengan fungsi SQL, lihatAWS Clean Rooms Fungsi Spark SQL.
Jenis pengembalian untuk perhitungan
Mengingat kumpulan tipe data numerik yang didukung AWS Clean Rooms, tabel berikut menunjukkan tipe pengembalian yang diharapkan untuk operasi penambahan, pengurangan, perkalian, dan pembagian. Kolom pertama di sisi kiri tabel mewakili operan pertama dalam perhitungan, dan baris atas mewakili operan kedua.
| Operan 1 | Operan 2 | Jenis pengembalian |
|---|---|---|
| SMALLINT atau SHORT | SMALLINT atau SHORT | SMALLINT atau SHORT |
| SMALLINT atau SHORT | INTEGER | INTEGER |
| SMALLINT atau SHORT | BIGINT | BIGINT |
| SMALLINT atau SHORT | DECIMAL | DECIMAL |
| SMALLINT atau SHORT | FLOAT4 | FLOAT8 |
| SMALLINT atau SHORT | FLOAT8 | FLOAT8 |
| INTEGER | INTEGER | INTEGER |
| INTEGER | BIGINT atau PANJANG | BIGINT atau PANJANG |
| INTEGER | DECIMAL | DECIMAL |
| INTEGER | FLOAT4 | FLOAT8 |
| INTEGER | FLOAT8 | FLOAT8 |
| BIGINT atau PANJANG | BIGINT atau PANJANG | BIGINT atau PANJANG |
| BIGINT atau PANJANG | DECIMAL | DECIMAL |
| BIGINT atau PANJANG | FLOAT4 | FLOAT8 |
| BIGINT atau PANJANG | FLOAT8 | FLOAT8 |
| DECIMAL | DECIMAL | DECIMAL |
| DECIMAL | FLOAT4 | FLOAT8 |
| DECIMAL | FLOAT8 | FLOAT8 |
| FLOAT4 | FLOAT8 | FLOAT8 |
| FLOAT8 | FLOAT8 | FLOAT8 |
Presisi dan skala hasil DESIMAL yang dihitung
Tabel berikut merangkum aturan untuk menghitung presisi dan skala yang dihasilkan ketika operasi matematika mengembalikan hasil DESIMAL. Dalam tabel ini, p1 dan s1 mewakili presisi dan skala operan pertama dalam perhitungan. p2dan s2 mewakili presisi dan skala operan kedua. (Terlepas dari perhitungan ini, presisi hasil maksimum adalah 38, dan skala hasil maksimum adalah 38.)
| Operasi | Presisi dan skala hasil |
|---|---|
| + atau - | Skala = max(s1,s2) presisi = |
| * | Skala = s1+s2 presisi = |
| / | Skala = max(4,s1+p2-s2+1) presisi = |
Misalnya, kolom PRICEPAID dan COMMISSION dalam tabel PENJUALAN keduanya kolom DESIMAL (8,2). Jika Anda membagi PRICEPAID dengan KOMISI (atau sebaliknya), rumus diterapkan sebagai berikut:
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)
Perhitungan berikut adalah aturan umum untuk menghitung presisi dan skala yang dihasilkan untuk operasi yang dilakukan pada nilai DECIMAL dengan operator set seperti UNION, INTERSECT, dan EXCEPT atau fungsi seperti COALESCE dan DECODE:
Scale = max(s1,s2) Precision = min(max(p1-s1,p2-s2)+scale,19)
Misalnya, tabel DEC1 dengan satu kolom DECIMAL (7,2) digabungkan dengan tabel DEC2 dengan satu kolom DECIMAL (15,3) untuk membuat tabel DEC3. Skema DEC3 menunjukkan bahwa kolom menjadi kolom NUMERIC (15,3).
select * from dec1 union select * from dec2;
Dalam contoh di atas, rumus diterapkan sebagai berikut:
Precision = min(max(7-2,15-3) + max(2,3), 19) = 12 + 3 = 15 Scale = max(2,3) = 3 Result = DECIMAL(15,3)
Catatan tentang operasi divisi
Untuk operasi pembagian, kondisi dibagi dengan nol mengembalikan kesalahan.
Batas skala 100 diterapkan setelah presisi dan skala dihitung. Jika skala hasil yang dihitung lebih besar dari 100, hasil pembagian diskalakan sebagai berikut:
-
presisi =
precision - (scale - max_scale) -
Skala =
max_scale
Jika presisi yang dihitung lebih besar dari presisi maksimum (38), presisi dikurangi menjadi 38, dan skala menjadi hasil dari: max(38 + scale
- precision), min(4, 100))
Kondisi luapan
Overflow diperiksa untuk semua perhitungan numerik. Data DESIMAL dengan presisi 19 atau kurang disimpan sebagai bilangan bulat 64-bit. Data DESIMAL dengan presisi yang lebih besar dari 19 disimpan sebagai bilangan bulat 128-bit. Presisi maksimum untuk semua nilai DECIMAL adalah 38, dan skala maksimum adalah 37. Kesalahan luapan terjadi ketika nilai melebihi batas ini, yang berlaku untuk kumpulan hasil menengah dan akhir:
-
Pengecoran eksplisit menghasilkan kesalahan overflow runtime ketika nilai data tertentu tidak sesuai dengan presisi atau skala yang diminta yang ditentukan oleh fungsi cast. Misalnya, Anda tidak dapat menampilkan semua nilai dari kolom PRICEPAID di tabel SALES (kolom DECIMAL (8,2)) dan mengembalikan hasil DECIMAL (7,3):
select pricepaid::decimal(7,3) from sales; ERROR: Numeric data overflow (result precision)Kesalahan ini terjadi karena beberapa nilai yang lebih besar di kolom PRICEPAID tidak dapat ditayangkan.
-
Operasi perkalian menghasilkan hasil di mana skala hasil adalah jumlah skala masing-masing operan. Jika kedua operan memiliki skala 4, misalnya, skala hasilnya adalah 8, hanya menyisakan 10 digit untuk sisi kiri titik desimal. Oleh karena itu, relatif mudah untuk mengalami kondisi luapan ketika mengalikan dua bilangan besar yang keduanya memiliki skala signifikan.
Perhitungan numerik dengan tipe INTEGER dan DECIMAL
Ketika salah satu operan dalam perhitungan memiliki tipe data INTEGER dan operan lainnya adalah DECIMAL, operan INTEGER secara implisit digunakan sebagai DECIMAL.
-
SMALLINT atau SHORT digunakan sebagai DECIMAL (5,0)
-
INTEGER diberikan sebagai DECIMAL (10,0)
-
BIGINT atau LONG digunakan sebagai DECIMAL (19,0)
Misalnya, jika Anda mengalikan SALES.COMMISSION, kolom DECIMAL (8,2) SALES.QTYSOLD, dan kolom SMALINT, perhitungan ini diberikan sebagai:
DECIMAL(8,2) * DECIMAL(5,0)