0
0
0
share
#database#sql#mysql#mariadb
0 Reactions
0 Komentar
LAG dan LEAD Function di MySQL
![Profile](https://image.web.id/images/Avatar.jpg)
Soeleman • 2 Maret 2017
![LAG dan LEAD Function di MySQL](https://www.codepolitan.com/uploads/image/source/13629/codepolitan_mysql_banner_700_350.png)
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](https://dede.gitlab.io/a/i/p/sql-lag-lead-mysql/table-entrylog.png)
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](https://dede.gitlab.io/a/i/p/sql-lag-lead-mysql/lag-resultset.png)
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](https://dede.gitlab.io/a/i/p/sql-lag-lead-mysql/lag-plain.png)
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](https://dede.gitlab.io/a/i/p/sql-lag-lead-mysql/lead-resultset.png)
Caranya sama dengan LAG. Yang kita perlukan adalah mengeser urutan resultset lebih tinggi dari row di-resultset yang sekarang.
![alt text](https://dede.gitlab.io/a/i/p/sql-lag-lead-mysql/lead-plain.png)
LAG + LEAD
Seperti yang diprediksi, biasa juga pengguna data akan meminta kombinasi dari itu.
![alt text](https://dede.gitlab.io/a/i/p/sql-lag-lead-mysql/lag-lead-resultset.png)
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](https://dede.gitlab.io/a/i/p/sql-lag-lead-mysql/lag-lead-plain.png)
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](https://dede.gitlab.io/a/i/p/sql-lag-lead-mysql/lag-lead-table.png)
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](https://dede.gitlab.io/a/i/p/sql-lag-lead-mysql/lag-lead-memory.png)
View
Bisa juga kita memanfaatkan view sebagai cache resultset, apalagi kalau memang datanya tidak banyak bervariasi seperti pada contoh disini.
![alt text](https://dede.gitlab.io/a/i/p/sql-lag-lead-mysql/view-entrylog.png)
Menggunakannya juga tidak banyak berbeda dengan cara lainnya.
![alt text](https://dede.gitlab.io/a/i/p/sql-lag-lead-mysql/lag-lead-view.png)
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.