Sunday, January 20, 2013

Get First Record from 'Group By' on Query SQL Server

Jika diketahui record dari sebuah tabel 'identitas' seperti berikut:

NomorNama
1
Saya
1
Aku
2
Kamu
2
Anda
1
I'm

Kemudian yang ingin saya lakukan adalah menampilkan value/nilai berdasarkan pengelompokkan Nomor dan mengambil value Nama berdasarkan nilai yang pertama. Jadi yang akan tertampil adalah :

NomorNama
1
Saya
2
Kamu

Jika menggunakan query di MySQL kita bisa menggunakan query seperti berikut:

select No, Nama from identitas group by No

Query tersebut benar karena dalam MySQL akan mengambil nilai yang paling atas dalam group itu. Namun untuk query di SQL Server, query diatas akan mengalami error karena variabel selain yang di group (Nama) harus menggunakan agregasi (max, min, avg, sum).

Permasalahan yang ada adalah di dalam query SQL Server tidak ada fungsi agregasi yang memilih record pertama dari group. Logikanya jika mengandaikan terdapat fungsi untuk memilih record pertama yaitu 'first', maka query bisa dilakukan dengan cara berikut:

select No, first(Nama) from identitas group by No

Itu jika fungsi 'first' ada maka hasil query yang tertampil adalah:

NomorNama
1
Saya
2
Kamu

Tetapi, fungsi 'first' itu tidak ada. Mungkin hal ini dikarenakan fungsi 'first' memiliki manfaat yang tidak terlalu berguna sehingga tidak dibuatkan oleh Microsoft.

Tetapi bagaimana jika ingin mendapatkan nilai dari first tersebut? Dapat dilakukan dengan sedikit mengakali query dengan cara 'bodoh' seperti berikut:

select distinct No, (select top 1 Nama from identitas B where B.No = A.No) from identitas A

Dengan memakai fungsi projection menggunakan select seperti itu, maka akan dapat menghasilkan nilai pertama seperti pada group MySQL (walau dalam query tersebut tidak menggunakan group by, tetapi dengan menambahkan distinct).

No comments:

Post a Comment