窗口函数的基本用法
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