mysql窗口函数range
时间: 2024-12-31 16:42:20 浏览: 7
### 使用 `RANGE` 窗口框架
在 MySQL 中,`RANGE` 是一种用于定义窗口边界的选项之一。它允许基于值范围来指定窗口边界而不是基于行数。这意味着当使用 `RANGE` 时,所有具有相同分区键和顺序列值的记录都将被考虑在同一范围内。
对于数值类型的字段,可以直接指定期望的距离;而对于日期时间类型,则可以通过特定的时间间隔单位来进行比较。需要注意的是,在某些情况下,如果存在重复值,则可能会导致返回多于预期数量的结果集[^2]。
#### 示例:按金额计算累计销售额
假设有一个销售表 `sales`,其中包含店铺 ID (`shop_id`)、交易日期(`sale_date`) 和每笔交易额(`amount`)三个字段。现在想要查询每个商店每天相对于前一天的最大单日营业额变化情况:
```sql
WITH daily_sales AS (
SELECT shop_id,
sale_date,
SUM(amount) as total_amount
FROM sales
GROUP BY shop_id, sale_date
)
SELECT ds.shop_id,
ds.sale_date,
ds.total_amount,
MAX(ds.total_amount) OVER w - LAG(MAX(ds.total_amount) OVER w, 1, 0) OVER (PARTITION BY ds.shop_id ORDER BY ds.sale_date) AS change_from_previous_day
FROM daily_sales ds
WINDOW w AS (PARTITION BY ds.shop_id ORDER BY ds.sale_date RANGE INTERVAL '1' DAY PRECEDING);
```
此查询首先通过CTE(公用表表达式)汇总每日各店总销量,接着在外层查询中应用了一个带有 `RANGE` 子句的窗口函数。这里特别之处在于使用了 `INTERVAL '1' DAY PRECEDING` 来表示当前行及其前一日的数据都属于同一个逻辑区间内参与聚合运算。
阅读全文