Perhitungan dengan nilai numerik - Amazon Redshift

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 konteks ini, komputasi mengacu pada operasi matematika biner: penjumlahan, pengurangan, perkalian, dan pembagian. Bagian ini menjelaskan jenis pengembalian yang diharapkan untuk operasi ini, serta rumus spesifik yang diterapkan untuk menentukan presisi dan skala saat tipe DECIMAL data terlibat.

Ketika nilai numerik dihitung selama pemrosesan kueri, Anda mungkin mengalami 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 (jenis promosi) atau parameter konfigurasi Amazon Redshift untuk mengatasi masalah ini.

Untuk informasi tentang hasil perhitungan serupa dengan SQL fungsi, lihat. Fungsi agregat

Jenis pengembalian untuk perhitungan

Mengingat kumpulan tipe data numerik yang didukung di Amazon Redshift, 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.

INT2 INT4 INT8 DECIMAL FLOAT4 FLOAT8
INT2 INT2 INT4 INT8 DECIMAL FLOAT8 FLOAT8
INT4 INT4 INT4 INT8 DECIMAL FLOAT8 FLOAT8
INT8 INT8 INT8 INT8 DECIMAL FLOAT8 FLOAT8
DECIMAL DECIMAL DECIMAL DECIMAL DECIMAL FLOAT8 FLOAT8
FLOAT4 FLOAT8 FLOAT8 FLOAT8 FLOAT8 FLOAT4 FLOAT8
FLOAT8 FLOAT8 FLOAT8 FLOAT8 FLOAT8 FLOAT8 FLOAT8

Presisi dan skala hasil yang dihitung DECIMAL

Tabel berikut merangkum aturan untuk menghitung presisi dan skala yang dihasilkan ketika operasi matematika mengembalikan DECIMAL hasil. Dalam tabel ini, p1 dan s1 mewakili presisi dan skala operan pertama dalam perhitungan dan p2 dan s2 mewakili presisi dan skala operan kedua. (Terlepas dari perhitungan ini, presisi hasil maksimum adalah 38, dan skala hasil maksimum adalah 38.)

Operasi Ketepatan dan skala hasil
+ atau - Skala = max(s1,s2)

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

* Skala = s1+s2

presisi = p1+p2+1

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

presisi = p1-s1+ s2+scale

Misalnya, kolom PRICEPAID dan COMMISSION kolom dalam SALES tabel keduanya DECIMAL (8,2) kolom. Jika Anda membagi PRICEPAID dengan COMMISSION (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 DECIMAL nilai-nilai dengan operator yang ditetapkan seperti UNIONINTERSECT,, dan EXCEPT atau fungsi seperti COALESCE danDECODE:

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

Misalnya, DEC1 tabel dengan satu DECIMAL (7,2) kolom digabungkan dengan DEC2 tabel dengan satu DECIMAL (15,3) kolom untuk membuat tabel. DEC3 Skema DEC3 menunjukkan bahwa kolom menjadi kolom NUMERIC (15,3).

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

Hasil

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

Pada 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 divisi, divide-by-zero kondisi 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. DECIMALdata dengan presisi 19 atau kurang disimpan sebagai bilangan bulat 64-bit. DECIMALdata dengan presisi yang lebih besar dari 19 disimpan sebagai bilangan bulat 128-bit. Presisi maksimum untuk semua DECIMAL nilai adalah 38, dan skala maksimum adalah 37. Kesalahan overflow terjadi ketika nilai melebihi batas ini, yang berlaku untuk set hasil menengah dan akhir:

  • Casting eksplisit menghasilkan kesalahan runtime overflow ketika nilai data tertentu tidak sesuai dengan presisi atau skala yang diminta yang ditentukan oleh fungsi cast. Misalnya, Anda tidak dapat mentransmisikan semua nilai dari PRICEPAID kolom dalam SALES tabel (a DECIMAL (8,2) kolom) 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 PRICEPAID kolom tidak dapat dilemparkan.

  • Operasi perkalian menghasilkan hasil di mana skala hasil adalah jumlah dari 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 angka besar yang keduanya memiliki skala signifikan.

    Contoh berikut menghasilkan kesalahan overflow.

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

    Anda dapat mengatasi kesalahan overflow dengan menggunakan pembagian alih-alih perkalian. Gunakan contoh berikut untuk membagi dengan 1 dibagi dengan pembagi asli.

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

Perhitungan numerik dengan INTEGER dan jenis DECIMAL

Ketika salah satu operan dalam perhitungan memiliki tipe INTEGER data dan operan lainnyaDECIMAL, operan secara implisit INTEGER dilemparkan sebagai: DECIMAL

  • INT2(SMALLINT) dilemparkan sebagai DECIMAL (5,0)

  • INT4(INTEGER) dilemparkan sebagai DECIMAL (10,0)

  • INT8(BIGINT) berperan sebagai DECIMAL (19,0)

Misalnya, jika Anda melipatgandakanSALES. COMMISSION, kolom DECIMAL (8,2), danSALES. QTYSOLD, SMALLINT kolom, perhitungan ini dilemparkan sebagai:

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