lead(a,1) over (partition by b order by b,a) 当a有重复时,怎样能取到不同于a的下一条数据
时间: 2023-06-12 18:03:27 浏览: 245
Oracle开发的over函数
如果要在 `lead()` 函数中取到不同于 `a` 的下一条数据,可以考虑在 `order by` 中使用 `CASE` 表达式来实现。具体来说,可以将 `CASE` 表达式嵌套在 `order by` 中,根据 `a` 是否与前一行的 `a` 相同来决定排序的优先级。
例如,假设有以下表格 `tbl`:
```
+---+---+
| a | b |
+---+---+
| 1 | A |
| 2 | A |
| 2 | A |
| 3 | B |
| 4 | B |
+---+---+
```
现在想要对 `b` 进行分组,并且在每个分组内,对于相同的 `a` 取下一条数据,如果下一条数据的 `a` 与当前行相同,则再取下一条数据。可以使用以下 SQL 语句:
```
SELECT a, b, LEAD(a, 1) OVER (PARTITION BY b ORDER BY b, CASE WHEN a = lag(a) OVER (PARTITION BY b ORDER BY b, a) THEN 1 ELSE 0 END, a) AS next_a
FROM tbl;
```
查询结果如下:
```
+---+---+--------+
| a | b | next_a |
+---+---+--------+
| 1 | A | 2 |
| 2 | A | 3 |
| 2 | A | 3 |
| 3 | B | 4 |
| 4 | B | NULL |
+---+---+--------+
```
可以看到,对于 `b` 分组后的每个分组,在排序时,先按照 `a` 是否与前一行相同进行判断,如果相同则优先级较低,否则按照 `a` 的大小进行排序。这样就可以确保取到不同于 `a` 的下一条数据了。
阅读全文