LAG dan LEAD Function di MySQL

Soeleman 2 Maret 2017

LAG dan LEAD Function di MySQL

MySQL tampaknya tertinggal banyak terutama dalam fitur. Seperti fitur analitik, yang di-SQL Server miliki. Dalam tulisan ini kita coba mengemulasi fungsi LAG dan LEAD itu dengan plain sql. Kita akan melihat bahwa fungsi ini akan banyak dipakai terutama untuk laporan dan perhitungan.

Table

Kita buat sebuah table EntryLog dengan data agar lebih mudah menjelaskannya.

alt text

LAG

Fungsi LAG ini berguna apabila kita ingin mendapatkan data yang ada di-row sebelum. Dan ini lebih terlihat sebagai Procedural daripada sql sendiri adalah menganut Declarative paradigma. Coba perhatikan resultset dibawah, hasil itu harus di proses per-row.

alt text

Dengan tidak adanya bantuan fungsi yang ada didalam databasenya, mau tidak mau kita harus mengemulasi fungsi itu. Dan cara mengabungkan dua resultset dan mengeser salah satu resultset-nya lebih rendah urutannya.

alt text

LEAD

Kebalikan fungsi LAG adalah LEAD. Ia akan mengambil data yang ada di-row sesudahnya. Ini memang terlihat tidak 'natural' untuk sql. Tapi data yang diperlukan seperti itu.

alt text

Caranya sama dengan LAG. Yang kita perlukan adalah mengeser urutan resultset lebih tinggi dari row di-resultset yang sekarang.

alt text

LAG + LEAD

Seperti yang diprediksi, biasa juga pengguna data akan meminta kombinasi dari itu.

alt text

Dengan cara yang kita gunakan, maka mudah sekali. Kita tinggal menggunakan tiga resultset. Satu resultset akan lebih rendah dan lebih tinggi dibandingkan dengan resultset utamanya.

alt text

Temp Table

Kalau kita perhatikan kita membuat resultset yang sama untuk digabungkan dalam rangka mengemulasi fungsi tersebut. Kita bisa saja membuat sebuah table sementara agar bisa digunakan untuk tujuan ini. Setidaknya kita membantu mengoptimalkan pengunaan database input-output (io).

alt text

Temp Memory

Apabila memiliki sumber daya yang besar, seperti ram besar. Kita bisa memanfaatkan itu sebagai penampungan data sementara dengan menggunakan temporary table.

Sayangnya temporary table di-MySQL tidak bisa self-join. Oleh karena itu kita mesti membuat tempat per-resultset.

alt text

View

Bisa juga kita memanfaatkan view sebagai cache resultset, apalagi kalau memang datanya tidak banyak bervariasi seperti pada contoh disini.

alt text

Menggunakannya juga tidak banyak berbeda dengan cara lainnya.

alt text

Penutup

Walaupun fitur itu tidak ada di-MYSQL, kita bisa membuatnya hanya dengan plain sql saja. Tentu penggunaan table sementara, temporary table atau view akan banyak membantu mengurangi beban query-engine.

Perlu diingat cara-cara diatas pada saat menggunakannya perlu juga pertimbangan atas situasi databasenya juga.

Referensi

Perhatian! Code yang ditampilkan dalam tulisan ini merupakan ilustrasi dari yang ingin dipaparkan dan bukan production ready code. Sudah banyak kejadian karena asal meng-copy-and-paste tanpa mengerti code yang diambil itu ke dalam production. Selain itu perlu ada tambahan code dan test sebelum siap untuk digunakan secara utuh.