沙滩星空的博客沙滩星空的博客

SQL使用LAG开窗函数计算当前与上一条记录的差异

窗口函数的基本用法

MySQL8之后才开始支持窗口函数

<窗口函数> OVER ([PARTITION BY <用于分组的列>] ORDER BY <用于排序的列>)

偏移分析函数LAG和LEAD

函数原型:

  • lag(exp_str,offset,defval) over(partion by ...order by ...)
  • lead(exp_str,offset,defval) over(partion by ...order by ...)

lag和lead分别是向前向后的意思,参数有三个。

  • expression:列名,即是字段名称
  • offset:偏移量,往前或者往后偏移offset行的数据
  • default_value:超出记录窗口的默认值(默认为null,可以设置为0)

函数释义:

  • lead(字段名, n): 将行向上移动n行,默认值为1
  • lag(字段名, n): 将行向下移动n行,默认值为1

通过LAG函数计算差异

SELECT
   order_id,
   order_date,
   order_amount,
   order_amount - LAG(order_amount) OVER (ORDER BY order_date) AS difference
FROM
   orders

示例中,我们从一个名为"orders"的表中选择了订单ID、订单日期、订单金额,并计算了当前订单金额与前一条订单金额的差异。使用LAG函数,我们可以获取前一条订单金额,并通过减法运算符计算差异。

计算百分比差异

SELECT
   order_id,
   order_date,
   order_amount,
   (order_amount - LAG(order_amount) OVER (ORDER BY order_date)) / LAG(order_amount) OVER (ORDER BY order_date) * 100 AS percentage_difference
FROM
   orders

处理首条记录

SELECT
   order_id,
   order_date,
   order_amount,
   (order_amount - LAG(order_amount) OVER (ORDER BY order_date)) / COALESCE(LAG(order_amount) OVER (ORDER BY order_date), 1) * 100 AS percentage_difference
FROM
   orders

我们使用COALESCE函数将前一条记录的值替换为1。这样,在计算百分比差异时,如果前一条记录不存在(即处理首条记录时),我们将使用默认值1来避免出现除以0的错误。

比较商品每天的库存差值估算销量

select
dd.抓取日期
,dd.SKU
,dd.SKU标题
,dd.SKU库存
,case when dd.SKU库存 - LAG(dd.SKU库存) OVER (ORDER BY dd.创建时间) > 0 then dd.SKU库存 - LAG(dd.SKU库存) OVER (ORDER BY dd.创建时间) else 0 end  AS 进货数
,case when dd.SKU库存 - LAG(dd.SKU库存) OVER (ORDER BY dd.创建时间) > 0 then 0 else -(dd.SKU库存 - LAG(dd.SKU库存) OVER (ORDER BY dd.创建时间)) end  AS 销售数

SQL 计算与上一条记录的差异 https://geek-docs.com/sql/sql-ask-answer/265_sql_calculating_difference_from_previous_record.html
SQL窗口函数用法总结,附带案例说明 https://zhuanlan.zhihu.com/p/366553723?utm_id=0
5个小案例说清楚-窗口函数(开窗函数) https://blog.csdn.net/jackfeng86/article/details/117729049
从零开始入门数据分析-SQL篇(全干货!入门SQL一篇文章就够了) https://zhuanlan.zhihu.com/p/626389748

未经允许不得转载:沙滩星空的博客 » SQL使用LAG开窗函数计算当前与上一条记录的差异

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址