MySQL中LAG()函數和LEAD()函數的使用

一、窗口函數的基本用法

從MySQL8之後才開始支持窗口函數

<窗口函數> OVER ([PARTITION BY <用於分組的列>] ORDER BY <用於排序的列>)

二、LAG()和LEAD()函數介紹

  • lag和lead分別是向前向後的意思
  • 參數有三個。expression:列名;offset:偏移量;default_value:超出記錄窗口的默認值(默認為null,可以設置為0)

三、數據準備(建表sql在最後)

在這裡插入圖片描述

1、LAG()函數:統計與前一天相比溫度更高的日期Id

我們先按照日期進行排序,然後找到當天比前一天溫度高的id;使用lag()函數,將溫度向後推一天。

select id, date, temperature, LAG(temperature, 1, 0) OVER (order by date) as temp FROM weather

查詢結果:

在這裡插入圖片描述

然後將temperature大於temp 並且temp不等於0的數據挑選出來

select id from (select id, date, temperature, LAG(temperature, 1, 0) OVER (order by date) as temp FROM weather) tmp where temperature>temp and temp != 0;

結果如下:

在這裡插入圖片描述

2、LEAD()函數:統計與後一天相比溫度更高的日期Id

我們還是先按照日期進行排序,然後找到當天比後一天溫度高的id;使用lead()函數,將溫度向後推一天。

select id, date, temperature, LEAD(temperature, 1, 0) OVER (order by date) as temp FROM weather

查詢結果:

在這裡插入圖片描述

然後將temperature大於temp 並且temp不等於0的數據挑選出來

select id from (select id, date, temperature, LEAD(temperature, 1, 0) OVER (order by date) as temp FROM weather) tmp where temperature>temp and temp != 0;

查詢結果:

在這裡插入圖片描述

四、建表數據sql

DROP TABLE IF EXISTS `weather`;
CREATE TABLE `weather`  (
  `id` int(11) NOT NULL,
  `date` date NULL DEFAULT NULL,
  `temperature` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of weather
-- ----------------------------
INSERT INTO `weather` VALUES (1, '2022-08-01', 20);
INSERT INTO `weather` VALUES (2, '2022-08-02', 25);
INSERT INTO `weather` VALUES (3, '2022-08-03', 22);
INSERT INTO `weather` VALUES (4, '2022-08-04', 22);
INSERT INTO `weather` VALUES (5, '2022-08-05', 26);
INSERT INTO `weather` VALUES (6, '2022-08-06', 28);
INSERT INTO `weather` VALUES (7, '2022-08-07', 20);

SET FOREIGN_KEY_CHECKS = 1;

到此這篇關於MySQL中LAG()函數和LEAD()函數的使用的文章就介紹到這瞭,更多相關mysql LAG()和LEAD()函數內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: