MySQL中的LAG和LEAD函數(shù)是常見的窗口函數(shù),用于計(jì)算某一行與前/后一行之間的差值。LAG函數(shù)用于獲取前一行的值,而LEAD函數(shù)則用于獲取后一行的值。這兩個(gè)函數(shù)可以用于處理時(shí)間序列數(shù)據(jù)、排名問題等。
-- LAG函數(shù)示例 SELECT name, score, LAG(score) OVER (ORDER BY score DESC) AS prev_score FROM students;
上面的代碼中,我們對(duì)學(xué)生表按成績(jī)進(jìn)行降序排序,并使用LAG函數(shù)獲取前一行的成績(jī)。例如,如果學(xué)生表中存在以下數(shù)據(jù):
+------+-------+ | name | score | +------+-------+ | Tom | 80 | | Jack | 90 | | Rose | 85 | +------+-------+
則上述代碼的結(jié)果為:
+------+-------+------------+ | name | score | prev_score | +------+-------+------------+ | Jack | 90 | NULL | | Rose | 85 | 90 | | Tom | 80 | 85 | +------+-------+------------+
可以看到,第一行的prev_score為NULL,因?yàn)樗鼪]有前一行。第二行和第三行的prev_score分別為90和85。
-- LEAD函數(shù)示例 SELECT name, score, LEAD(score) OVER (ORDER BY score DESC) AS next_score FROM students;
上面的代碼與LAG函數(shù)示例類似,只是將LAG函數(shù)換成了LEAD函數(shù)。我們對(duì)學(xué)生表按成績(jī)進(jìn)行降序排序,并使用LEAD函數(shù)獲取后一行的成績(jī)。例如,如果學(xué)生表中存在以下數(shù)據(jù):
+------+-------+ | name | score | +------+-------+ | Tom | 80 | | Jack | 90 | | Rose | 85 | +------+-------+
則上述代碼的結(jié)果為:
+------+-------+------------+ | name | score | next_score | +------+-------+------------+ | Jack | 90 | 85 | | Rose | 85 | 80 | | Tom | 80 | NULL | +------+-------+------------+
可以看到,最后一行的next_score為NULL,因?yàn)樗鼪]有后一行。第一行和第二行的next_score分別為85和80。
總之,LAG和LEAD函數(shù)是MySQL中非常有用的窗口函數(shù),可以用于處理復(fù)雜的計(jì)算邏輯。我們可以在ORDER BY子句中指定排序字段,并在LAG和LEAD函數(shù)中傳遞需要計(jì)算的字段,從而獲得所需的結(jié)果。