Saya membutuhkan fungsi agregat yang tidak disediakan oleh MySQL.
Saya ingin itu dalam rasa MySQL SQL (yaitu, bukan dalam C).
Bagaimana saya melakukan ini? Apa yang saya terjebak adalah menciptakan fungsi agregat - dokumen sepertinya tidak menyebutkan bagaimana ini dilakukan.
Contoh penggunaan product
fungsi yang diinginkan :
mysql> select product(col) as a from `table`;
+------+
| a |
+------+
| 144 |
+------+
1 row in set (0.00 sec)
mysql> select col, product(col) as a from `table` group by col;
+-----+------+
| col | a |
+-----+------+
| 6 | 36 |
| 4 | 4 |
+-----+------+
2 rows in set (0.01 sec)
Saya tidak tahu apakah ada cara untuk mendefinisikan fungsi agregat baru, bukan tanpa mengacaukan kode sumber MySQL.
Tetapi jika angka-angka Anda semuanya positif, Anda mungkin berasal dari identitas aritmatika:
yang dapat Anda gunakan
EXP(SUM(LOG(x)))
untuk menghitungPRODUCT(x)
. Uji dalam SQL-Fiddle :Ketika data dapat memiliki 0s, itu menjadi sedikit lebih rumit:
Diuji di SQL-Fiddle
Untuk DBMS lain, yang tidak memiliki konversi otomatis nilai boolean MySQL ke integer, the
harus diganti dengan:
Khusus untuk Oracle, beberapa perubahan akan diperlukan, tanpa mengubah logika jawabannya, hanya karena Oracle tidak mengikuti standar ANSI yang ketat di beberapa area. Diuji di SQL-Fiddle-2
sumber
product
seharusnya hanya menjadi salah satu contoh dari beberapa.PRODUCT(..., 0, ...) = 0
, kita menginginkan ituEXP(SUM(..., f(0), ...)) = 0
, untuk beberapaf
yang kita pilih, tetapi untuk memenuhi ini, kita memerlukan ituSUM(..., f(0), ...) = LOG(0)
- lagi-lagi digagalkan oleh masalah yang sama yang dicatat (0) ) tidak terdefinisi. Kita perlu memeriksa keberadaan nol dengan cara lain, misalnyaMIN(ABS(a)) = 0
. Jadi kita harus melakukannyaSELECT CASE WHEN MIN(ABS(a)) = 0 THEN 0 ELSE EXP(SUM(LOG(a))) END AS product
. Apakah ini jenis hal yang Anda pikirkan?Untuk mempelajari cara memancing, saya telah berhasil menyusun dan menginstal "Halo, Dunia!" UDF (fungsi yang ditentukan pengguna) untuk MySQL ditemukan di sini . File hello_world.so (setelah dipatuhi
gcc -shared -o hello_world.so -I /usr/include/mysql hello_world.c
) harus disimpan di / usr / lib / mysql / plugins / dengan 755 izin pada sistem linux Ubuntu. ["-I / usr / include / mysql" adalah path ke file header mysql; Saya menemukan kode saya tidak dapat dikompilasi tanpa parameter ini, tetapi YMMV.]Program tidak melakukan apa pun selain mencetak string "Halo, Dunia!" untuk setiap record dalam dataset yang dihasilkan dari sebuah query, tetapi hanya itu yang harus dilakukan. Saya akan mencoba menulis fungsi agregat KECIL dalam beberapa hari mendatang. Ada contoh fungsi agregat yang menghitung biaya rata-rata sekelompok catatan harga dan kuantitas; fungsi KECIL seharusnya tidak jauh berbeda dari fungsi itu pada akhirnya.
Semoga ini membantu.
sumber