PostgreSQL 的 lag函数

本文通过创建测试表并插入数据,演示了 SQL 中 Lag 函数的使用方法,包括不同偏移量及默认值的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

create table  test(id integer);

insert into test values(1);

insert into test values(3);

insert into test values(6);

insert into test values(10);

insert into test values(15);

insert into test values(24);

------------------------------------------

select id, lag(id, 1,0) from test;

id     lag

1      0

3      1 

6      3

10     6

15    10

24    15

------------------------------------------ 

select id, lag(id, 2,0) from test;

id     lag

1      0

3      0 

6      1

10     3

15    6

24    10

------------------------------------------ 

select id, lag(id, 1,1) from test;

id     lag

1      1

3      1 

6      3

10     6

15    10

24    15

------------------------------------------ 

select id, lag(id, 2,1) from test;

id     lag

1      1

3      1 

6      1

10     3

15    6

24    10


本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/09/06/2673282.html,如需转载请自行联系原作者
### 使用LAG函数结合OVER子句实现分组计算 在SQL中,LAG函数是一种窗口函数,用于访问结果集中的前一行数据,而无需进行自连接。通过结合OVER子句,可以指定分组和排序规则,从而实现复杂的分组计算[^1]。 #### LAG函数的基本语法 LAG函数的语法如下: ```sql LAG(column_name, offset, default_value) OVER (PARTITION BY partition_expression ORDER BY sort_expression) ``` - `column_name`:要获取的列名。 - `offset`:偏移量,默认为1,表示获取前一行的数据。 - `default_value`:如果偏移超出范围,则返回默认值(可选)。 - `PARTITION BY`:定义分组依据。 - `ORDER BY`:定义排序规则。 #### 结合OVER子句的使用示例 以下是一个具体的例子,展示如何使用LAG函数结合OVER子句进行分组操作: 假设有一个名为`sales`的表,包含以下字段: - `id`:销售记录ID。 - `product_id`:产品ID。 - `sale_date`:销售日期。 - `amount`:销售金额。 目标是计算每个产品的当前销售金额与上一次销售金额的差值。 ```sql SELECT id, product_id, sale_date, amount, LAG(amount, 1, NULL) OVER (PARTITION BY product_id ORDER BY sale_date) AS prev_amount, amount - LAG(amount, 1, NULL) OVER (PARTITION BY product_id ORDER BY sale_date) AS diff_amount FROM sales; ``` - `PARTITION BY product_id`:按`product_id`分组。 - `ORDER BY sale_date`:按`sale_date`排序。 - `LAG(amount, 1, NULL)`:获取当前行的前一行`amount`值。 #### 数据库支持情况 需要注意的是,LAG函数的支持情况因数据库而异。Oracle 9i及以上版本、SQL Server 2012及以上版本均支持LAG函数[^3]。对于MySQL,从8.0版本开始支持窗口函数[^4]。PostgreSQL也支持LAG函数。 #### 注意事项 - 如果未指定`PARTITION BY`,LAG函数将对整个结果集进行操作。 - 如果未指定`ORDER BY`,LAG函数的行为可能不可预测。 - 在某些数据库中,LAG函数可能需要显式指定默认值以避免空值问题。 ### 示例代码 以下是一个完整的示例,展示如何在MySQL中使用LAG函数: ```sql CREATE TABLE sales ( id INT, product_id INT, sale_date DATE, amount DECIMAL(10, 2) ); INSERT INTO sales (id, product_id, sale_date, amount) VALUES (1, 101, '2023-01-01', 100.00), (2, 101, '2023-01-02', 150.00), (3, 102, '2023-01-01', 200.00), (4, 102, '2023-01-02', 250.00); SELECT id, product_id, sale_date, amount, LAG(amount, 1, NULL) OVER (PARTITION BY product_id ORDER BY sale_date) AS prev_amount, amount - LAG(amount, 1, NULL) OVER (PARTITION BY product_id ORDER BY sale_date) AS diff_amount FROM sales; ``` 此查询将返回每个产品的当前销售金额与上一次销售金额的差值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值