LISTAGG fungsi - Amazon Redshift

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

LISTAGG fungsi

Untuk setiap grup dalam kueri, fungsi LISTAGG agregat mengurutkan baris untuk grup tersebut sesuai ORDER dengan ekspresi BY, lalu menggabungkan nilai menjadi satu string.

Sintaks

LISTAGG( [DISTINCT] aggregate_expression [, 'delimiter' ] ) [ WITHIN GROUP (ORDER BY order_list) ]

Argumen

DISTINCT

Klausa yang menghilangkan nilai duplikat dari ekspresi yang ditentukan sebelum menggabungkan. Spasi trailing diabaikan. Misalnya, string 'a' dan 'a ' diperlakukan sebagai duplikat. LISTAGGmenggunakan nilai pertama yang ditemui. Untuk informasi selengkapnya, lihat Signifikansi trailing blank.

aggregate_expression

Ekspresi yang valid, seperti nama kolom, yang memberikan nilai untuk digabungkan. NULLnilai dan string kosong diabaikan.

pembatas

Konstanta string untuk memisahkan nilai gabungan. Defaultnya adalahNULL.

WITHINGROUP(ORDEROLEH order_list)

Sebuah klausa yang menentukan urutan dari nilai agregat.

Pengembalian

VARCHAR(MAX). Jika hasil set lebih besar dari VARCHAR ukuran maksimum, LISTAGG mengembalikan kesalahan berikut:

Invalid operation: Result size exceeds LISTAGG limit

Catatan penggunaan

  • Jika pernyataan menyertakan beberapa LISTAGG fungsi yang menggunakan WITHIN GROUP klausa, setiap WITHIN GROUP klausa harus menggunakan nilai BY yang samaORDER.

    Misalnya, pernyataan berikut mengembalikan kesalahan.

    SELECT LISTAGG(sellerid) WITHIN GROUP (ORDER BY dateid) AS sellers, LISTAGG(dateid) WITHIN GROUP (ORDER BY sellerid) AS dates FROM sales;

    Pernyataan berikut berjalan dengan sukses.

    SELECT LISTAGG(sellerid) WITHIN GROUP (ORDER BY dateid) AS sellers, LISTAGG(dateid) WITHIN GROUP (ORDER BY dateid) AS dates FROM sales; SELECT LISTAGG(sellerid) WITHIN GROUP (ORDER BY dateid) AS sellers, LISTAGG(dateid) AS dates FROM sales;

Contoh

Contoh berikut agregat penjualIDs, dipesan oleh ID penjual.

SELECT LISTAGG(sellerid, ', ') WITHIN GROUP (ORDER BY sellerid) FROM sales WHERE eventid = 4337; listagg ---------------------------------------------------------------------------------------------------------------------------------------- 380, 380, 1178, 1178, 1178, 2731, 8117, 12905, 32043, 32043, 32043, 32432, 32432, 38669, 38750, 41498, 45676, 46324, 47188, 47188, 48294

Contoh berikut digunakan DISTINCT untuk mengembalikan daftar penjual unikIDs.

SELECT LISTAGG(DISTINCT sellerid, ', ') WITHIN GROUP (ORDER BY sellerid) FROM sales WHERE eventid = 4337; listagg ------------------------------------------------------------------------------------------- 380, 1178, 2731, 8117, 12905, 32043, 32432, 38669, 38750, 41498, 45676, 46324, 47188, 48294

Contoh berikut agregat penjual IDs dalam urutan tanggal.

SELECT LISTAGG(sellerid, ', ') WITHIN GROUP (ORDER BY dateid) FROM sales WHERE eventid = 4337; listagg ----------------------------------------------------------------------------------------------------------------------------------------- 41498, 47188, 47188, 1178, 1178, 1178, 380, 45676, 46324, 48294, 32043, 32043, 32432, 12905, 8117, 38750, 2731, 32432, 32043, 380, 38669

Contoh berikut mengembalikan daftar tanggal penjualan yang dipisahkan pipa untuk pembeli dengan ID 660.

SELECT LISTAGG( (SELECT caldate FROM date WHERE date.dateid=sales.dateid), ' | ' ) WITHIN GROUP (ORDER BY sellerid DESC, salesid ASC) FROM sales WHERE buyerid = 660; listagg ------------------------------------------------- 2008-07-16 | 2008-07-09 | 2008-01-01 | 2008-10-26

Contoh berikut mengembalikan daftar penjualan yang dipisahkan koma IDs untuk pembeli IDs 660, 661, dan 662.

SELECT buyerid, LISTAGG(salesid,', ') WITHIN GROUP (ORDER BY salesid) AS sales_id FROM sales WHERE buyerid BETWEEN 660 AND 662 GROUP BY buyerid ORDER BY buyerid; buyerid | sales_id --------+----------------------------------------------------- 660 | 32872, 33095, 33514, 34548 661 | 19951, 20517, 21695, 21931 662 | 3318, 3823, 4215, 51980, 53202, 55908, 57832, 171603