"ROWS BETWEEN ... AND ... 或 RANGE BETWEEN ... AND ...: 这两个子句定义了窗口的界限,比如基于行号的上下文(ROWS)或基于范围的上下文(RANGE)"。 是什么意思 举个开窗运算的例子好让我理解
时间: 2024-10-21 18:07:37 浏览: 13
`ROWS BETWEEN ... AND ...` 和 `RANGE BETWEEN ... AND ...` 都是用来在窗口函数中定义行的范围边界,以便确定哪些行应包含在计算的窗口内。这里的关键点在于如何确定每个行的“邻居”。
1. **ROWS BETWEEN...AND...**: 这种方式基于行的位置,即当前行与其之前和之后的固定数目的行。例如,你可以设置窗口从当前行开始,包括自身并向前延伸 n 行,向后延伸 m 行。假设你有一个订单表,你想查看每个客户的最近5笔订单,就可以这么定义:
```sql
SELECT *
FROM orders
WITH ROLLUP
OVER (PARTITION BY customer_id
ORDER BY order_date
ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING)
```
这里,`CURRENT ROW` 表示当前行,`4 FOLLOWING` 表示接下来4行。
2. **RANGE BETWEEN...AND...**: 这种方式基于值的范围,而不是绝对的行数。例如,你可以定义一个窗口,其中所有在某列值(如日期)上小于当前值或大于当前值一定范围内的行。同样看订单表,你想要计算每个客户每个月的订单量,可以这样定义:
```sql
SELECT *
FROM orders
OVER (PARTITION BY customer_id, DATE_TRUNC('month', order_date)
ORDER BY order_date
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
```
这表示窗口包括所有在当前月之前的订单。
总之,这两个子句帮助你创建一个动态的、可变大小的窗口,以便针对每个行进行个性化的统计或分析操作。
阅读全文