Topik ini menjelaskan kompatibilitas antara pekerjaan dan data status yang digunakan untuk memulai pekerjaan setelah Anda memodifikasi kueri agregasi OVER. Dalam kueri agregasi OVER, fungsi agregat digunakan bersama dengan klausa OVER.
Modifikasi yang kompatibel
Menambah, menghapus, atau memodifikasi bidang agregat non-distinct. Bidang agregat adalah hasil yang dikembalikan oleh fungsi agregat.
Sebagian kompatibel: Menambahkan bidang agregat. Nilai dari bidang yang ditambahkan akan bertambah saat pekerjaan dimulai.
Sepenuhnya kompatibel: Menghapus bidang agregat yang ada. Data status dari bidang yang dihapus akan dibuang.
Sebagian kompatibel: Menambahkan bidang agregat dan menghapus bidang agregat yang ada secara bersamaan. Nilai dari bidang yang ditambahkan akan bertambah saat pekerjaan dimulai. Data status dari bidang yang dihapus akan dibuang.
Sebagian kompatibel: Memodifikasi bidang agregat yang ada. Modifikasi ini mencakup operasi berikut: menghapus bidang agregat asli dan menambahkan yang baru. Nilai dari bidang yang ditambahkan akan bertambah saat pekerjaan dimulai. Data status dari bidang yang dihapus akan dibuang.
nullJika Anda tidak memodifikasi bidang agregat, hasil perhitungan dari bidang tersebut akan tetap sama baik menggunakan data status maupun tidak.
Kueri agregasi OVER mengembalikan nilai agregat dan data input yang sesuai. Jika skema input berubah, pekerjaan menjadi tidak kompatibel dengan data status.
-- Pernyataan SQL asli: select a, b, c, sum(b) over (partition by a order by ts), max(c) over (partition by a order by ts) from MyTable; -- Sebagian kompatibel: Tambahkan count(c), yang merupakan bidang agregat. -- Hasil perhitungan sum(b) dan max(c) tidak terpengaruh. Nilai count(c) bertambah dari 0 saat pekerjaan dimulai. select a, b, c, sum(b) over (partition by a order by ts), max(c) over (partition by a order by ts), count(c) over (partition by a order by ts) from MyTable; -- Sepenuhnya kompatibel: Hapus sum(b). -- Hasil perhitungan max(c) tidak terpengaruh. select a, b, c, max(c) over (partition by a order by ts) from MyTable; -- Sebagian kompatibel: Modifikasi bidang agregat dari max(c) menjadi min(c). -- Hasil perhitungan sum(b) tidak terpengaruh. Bidang max(c) dianggap dihapus dan data statusnya dibuang. -- Bidang min(c) dianggap sebagai bidang baru dan nilainya bertambah saat pekerjaan dimulai. select a, b, c, sum(b) over (partition by a order by ts), min(c) over (partition by a order by ts) from MyTable;Sepenuhnya kompatibel: Memodifikasi urutan bidang agregat non-distinct.
-- Pernyataan SQL asli: select a, b, c, sum(b) over (partition by a order by ts), max(c) over (partition by a order by ts) from MyTable -- Sepenuhnya kompatibel: Modifikasi urutan sum(b) dan max(c). -- Hasil perhitungan sum(b) dan max(c) tidak terpengaruh. select a, b, c, max(c) over (partition by a order by ts), sum(b) over (partition by a order by ts) from MyTable;Sepenuhnya kompatibel: Memodifikasi urutan kunci partisi.
-- Pernyataan SQL asli: select a, b, c, sum(b) over (partition by a,b order by ts), max(c) over (partition by a,b order by ts) from MyTable; -- Sepenuhnya kompatibel: Modifikasi urutan kunci partisi. select a, b, c, sum(b) over (partition by b,a order by ts), max(c) over (partition by b,a order by ts) from MyTable;Sepenuhnya kompatibel: Memodifikasi urutan bidang dalam skema atau menambah atau menghapus bidang tanpa mengubah skema.
-- Pernyataan SQL asli: select a, b, c, count(b) over (partition by a order by ts) from MyTable; -- Sepenuhnya kompatibel: Modifikasi urutan bidang b dan c untuk klausa OVER. select a, c, b, count(b) over (partition by a order by ts) from MyTable; -- Pernyataan SQL asli: select a, b, c, cnt from (select a, b, c, d, count(b) over (partition by a order by proctime) as cnt from src); -- Sepenuhnya kompatibel: Hapus bidang yang tidak digunakan untuk agregasi. select a, b, c, cnt from (select a, b, c, count(b) over (partition by a order by proctime) as cnt from src);
Modifikasi yang tidak kompatibel
Memodifikasi skema input untuk kueri agregasi OVER.
-- Pernyataan SQL asli: select a, b, c, sum(b) over (partition by a order by ts), max(c) over (partition by a order by ts) from MyTable; -- Tidak kompatibel: Tambahkan d sebagai bidang input. select a, b, c, d, max(c) over (partition by a order by ts), sum(b) over (partition by a order by ts) from MyTable; -- Tidak kompatibel: Modifikasi bidang input c. select a, b, c, max(c) over (partition by a order by ts), sum(b) over (partition by a order by ts) from ( select a, b, substring(c, 1, 5) as c from MyTable );Memodifikasi atribut yang ditentukan dalam klausa OVER, seperti kunci partisi untuk jendela, urutan pengurutan untuk jendela, dan frame jendela.
-- Pernyataan SQL asli: select a, b, c, max(c) over (partition by a order by ts asc rows between unbounded preceding and current row) from MyTable; -- Tidak kompatibel: Ubah kunci partisi dari a ke b. select a, b, c, max(c) over (partition by b order by ts asc rows between unbounded preceding and current row) from MyTable; -- Tidak kompatibel: Ubah urutan pengurutan dari naik ke turun. select a, b, c, max(c) over (partition by a order by ts desc rows between unbounded preceding and current row) from MyTable; -- Tidak kompatibel: Ubah definisi batas dari unbounded preceding menjadi 2 preceding. select a, b, c, max(c) over (partition by a order by ts asc rows between 2 preceding and current row) from MyTable;Menambah, menghapus, atau memodifikasi bidang agregat distinct.
-- Pernyataan SQL asli: select a, b, c, max(c) over (partition by a order by ts) from MyTable; -- Tidak kompatibel: Tambahkan count(distinct b), yang merupakan bidang agregat distinct. select a, b, c, max(c) over (partition by b order by ts), count(distinct b) over (partition by b order by ts) from MyTable;Memodifikasi semua bidang agregat.
-- Pernyataan SQL asli: select a, ts, min(b) over (partition by a order by ts) from MyTable; -- Tidak kompatibel: Modifikasi satu-satunya bidang agregat. select a, ts, max(b) over (partition by a order by ts) from MyTable;
Modifikasi yang menghasilkan kompatibilitas tidak diketahui
Jika Anda menggunakan fungsi agregat yang didefinisikan pengguna (UDAF) Python sebelum atau setelah modifikasi, sistem tidak dapat menentukan kompatibilitas.
-- Kompatibilitas tidak diketahui: Gunakan UDAF Python, seperti fungsi weighted_avg yang ditunjukkan dalam kode berikut, sebelum atau setelah modifikasi.
select min(a), min(b), min(c), weighted_avg(a, b), min(cnt)
from (select a, b, c, count(b)
over (partition by a, b order by ts) as cnt from MyTable);