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