Fungsi jendela PERCENTILE_CONT - Amazon Redshift

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Fungsi jendela PERCENTILE_CONT

PERCENTILE_CONT adalah fungsi distribusi terbalik yang mengasumsikan model distribusi kontinu. Dibutuhkan nilai persentil dan spesifikasi sortir, dan mengembalikan nilai interpolasi yang akan jatuh ke dalam nilai persentil yang diberikan sehubungan dengan spesifikasi pengurutan.

PERCENTILE_CONT menghitung interpolasi linier antara nilai setelah mengurutkannya. Menggunakan nilai persentil (P) dan jumlah baris bukan nol (N) dalam grup agregasi, fungsi menghitung nomor baris setelah mengurutkan baris sesuai dengan spesifikasi pengurutan. Nomor baris ini (RN) dihitung sesuai dengan RN = (1+ (P*(N-1)) rumus. Hasil akhir dari fungsi agregat dihitung dengan interpolasi linier antara nilai-nilai dari baris pada nomor baris dan. CRN = CEILING(RN) FRN = FLOOR(RN)

Hasil akhirnya adalah sebagai berikut.

Jika (CRN = FRN = RN) maka hasilnya adalah (value of expression from row at RN)

Jika tidak, hasilnya adalah sebagai berikut:

(CRN - RN) * (value of expression for row at FRN) + (RN - FRN) * (value of expression for row at CRN).

Anda hanya dapat menentukan klausa PARTITION dalam klausa OVER. Jika PARTITION ditentukan, untuk setiap baris, PERCENTILE_CONT mengembalikan nilai yang akan jatuh ke dalam persentil yang ditentukan di antara satu set nilai dalam partisi yang diberikan.

Sintaks

PERCENTILE_CONT ( percentile ) WITHIN GROUP (ORDER BY expr) OVER ( [ PARTITION BY expr_list ] )

Argumen

persentil

Konstanta numerik antara 0 dan 1. Null diabaikan dalam perhitungan.

DALAM GRUP (ORDER BY expr)

Menentukan nilai numerik atau tanggal/waktu untuk mengurutkan dan menghitung persentil atas.

DI ATAS

Menentukan partisi jendela. Klausa OVER tidak dapat berisi urutan jendela atau spesifikasi bingkai jendela.

PARTISI OLEH expr

Argumen opsional yang menetapkan rentang catatan untuk setiap grup dalam klausa OVER.

Pengembalian

Tipe pengembalian ditentukan oleh tipe data ekspresi ORDER BY dalam klausa WITHIN GROUP. Tabel berikut menunjukkan tipe pengembalian untuk setiap tipe data ekspresi ORDER BY.

Tipe input Tipe Pengembalian
INT2, INT4, INT8, NUMERIK, DESIMAL DECIMAL
MENGAPUNG, GANDA DOUBLE
DATE DATE
TIMESTAMP TIMESTAMP

Catatan penggunaan

Jika ekspresi ORDER BY adalah tipe data DECIMAL yang ditentukan dengan presisi maksimum 38 digit, ada kemungkinan bahwa PERCENTILE_CONT akan mengembalikan hasil yang tidak akurat atau kesalahan. Jika nilai pengembalian fungsi PERCENTILE_CONT melebihi 38 digit, hasilnya terpotong agar sesuai, yang menyebabkan hilangnya presisi. Jika, selama interpolasi, hasil antara melebihi presisi maksimum, luapan numerik terjadi dan fungsi mengembalikan kesalahan. Untuk menghindari kondisi ini, sebaiknya gunakan tipe data dengan presisi lebih rendah atau mentransmisikan ekspresi ORDER BY ke presisi yang lebih rendah.

Misalnya, fungsi SUM dengan argumen DECIMAL mengembalikan presisi default 38 digit. Skala hasilnya sama dengan skala argumen. Jadi, misalnya, SUM kolom DECIMAL (5,2) mengembalikan tipe data DECIMAL (38,2).

Contoh berikut menggunakan fungsi SUM dalam klausa ORDER BY dari fungsi PERCENTILE_CONT. Tipe data dari kolom PRICEPAID adalah DECIMAL (8,2), sehingga fungsi SUM mengembalikan DECIMAL (38,2).

select salesid, sum(pricepaid), percentile_cont(0.6) within group (order by sum(pricepaid) desc) over() from sales where salesid < 10 group by salesid;

Untuk menghindari potensi kehilangan presisi atau kesalahan luapan, lemparkan hasilnya ke tipe data DECIMAL dengan presisi lebih rendah, seperti yang ditunjukkan contoh berikut.

select salesid, sum(pricepaid), percentile_cont(0.6) within group (order by sum(pricepaid)::decimal(30,2) desc) over() from sales where salesid < 10 group by salesid;

Contoh

Contoh berikut menggunakan tabel WINSALES. Untuk deskripsi tabel WINSALES, lihatContoh tabel untuk contoh fungsi jendela.

select sellerid, qty, percentile_cont(0.5) within group (order by qty) over() as median from winsales; sellerid | qty | median ----------+-----+-------- 1 | 10 | 20.0 1 | 10 | 20.0 3 | 10 | 20.0 4 | 10 | 20.0 3 | 15 | 20.0 2 | 20 | 20.0 3 | 20 | 20.0 2 | 20 | 20.0 3 | 30 | 20.0 1 | 30 | 20.0 4 | 40 | 20.0 (11 rows)
select sellerid, qty, percentile_cont(0.5) within group (order by qty) over(partition by sellerid) as median from winsales; sellerid | qty | median ----------+-----+-------- 2 | 20 | 20.0 2 | 20 | 20.0 4 | 10 | 25.0 4 | 40 | 25.0 1 | 10 | 10.0 1 | 10 | 10.0 1 | 30 | 10.0 3 | 10 | 17.5 3 | 15 | 17.5 3 | 20 | 17.5 3 | 30 | 17.5 (11 rows)

Contoh berikut menghitung PERCENTILE_CONT dan PERCENTILE_DISC dari penjualan tiket untuk penjual di negara bagian Washington.

SELECT sellerid, state, sum(qtysold*pricepaid) sales, percentile_cont(0.6) within group (order by sum(qtysold*pricepaid::decimal(14,2) ) desc) over(), percentile_disc(0.6) within group (order by sum(qtysold*pricepaid::decimal(14,2) ) desc) over() from sales s, users u where s.sellerid = u.userid and state = 'WA' and sellerid < 1000 group by sellerid, state; sellerid | state | sales | percentile_cont | percentile_disc ----------+-------+---------+-----------------+----------------- 127 | WA | 6076.00 | 2044.20 | 1531.00 787 | WA | 6035.00 | 2044.20 | 1531.00 381 | WA | 5881.00 | 2044.20 | 1531.00 777 | WA | 2814.00 | 2044.20 | 1531.00 33 | WA | 1531.00 | 2044.20 | 1531.00 800 | WA | 1476.00 | 2044.20 | 1531.00 1 | WA | 1177.00 | 2044.20 | 1531.00 (7 rows)