Ini adalah peretasan MySQL favorit saya.
Ini adalah bagaimana Anda meniru fungsi lag:
SET @quot=-1;
select time,company,@quot lag_quote, @quot:=quote curr_quote
from stocks order by company,time;
lag_quote
memegang nilai kutipan baris sebelumnya. Untuk baris pertama @quot adalah -1.curr_quote
memegang nilai kutipan baris saat ini.
Catatan:
order by
klausa penting di sini seperti halnya dalam fungsi jendela biasa.- Anda mungkin juga ingin menggunakan jeda untuk
company
hanya untuk memastikan bahwa Anda menghitung perbedaan dalam tanda kutip daricompany
yang sama . - Anda juga dapat mengimplementasikan penghitung baris dengan cara yang sama
@cnt:[email protected]+1
Hal yang menyenangkan tentang skema ini adalah komputasinya sangat ramping dibandingkan dengan beberapa pendekatan lain seperti menggunakan fungsi agregat, prosedur tersimpan, atau memproses data di server aplikasi.
EDIT:
Sekarang sampai pada pertanyaan Anda untuk mendapatkan hasil dalam format yang Anda sebutkan:
SET @quot=0,@latest=0,company='';
select B.* from (
select A.time,A.change,IF(@comp<>A.company,1,0) as LATEST,@comp:=A.company as company from (
select time,company,[email protected] as change, @quot:=quote curr_quote
from stocks order by company,time) A
order by company,time desc) B where B.LATEST=1;
Bersarang tidak saling terkait sehingga tidak seburuk (secara komputasi) seperti yang terlihat (secara sintaksis) :)
Beri tahu saya jika Anda memerlukan bantuan untuk ini.