使用具有更高偏移量的滞后函数

lvjbypge  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(329)

假设我们有下面的输入表

cat  | value | position
------------------------
1    | A     |   1
1    | B     |   2
1    | C     |   3
1    | D     |   4
2    | C     |   1
2    | B     |   2 
2    | A     |   3
2    | D     |   4

如您所见,这些值 A,B,C,D 改变 position 在每个 category ,我想通过添加列来跟踪此更改 change 在每个人前面 value ,输出应如下所示:

cat  | value | position | change
    ---------------------------------
    1    | A     |   1      |  NULL
    1    | B     |   2      |  NULL
    1    | C     |   3      |  NULL
    1    | D     |   4      |  NULL
    2    | C     |   1      |   2
    2    | B     |   2      |   0
    2    | A     |   3      |  -2
    2    | D     |   4      |   0

例如 C 已经就位了 3 在类别中 1 移动到位置 1 在第2类中,因此具有 change2 . 我试着用 LAG() 偏移量为4的函数,但我失败了,如何编写此查询。

t98cgbkg

t98cgbkg1#

使用 lag() -用合适的 partition by 条款:

select
    t.*,
    lag(position) over(partition by value order by cat) - position change
from mytable t
nr9pn0ug

nr9pn0ug2#

你可以用 lag 然后 order by 维持原有秩序。这是演示。

select
    *,
    lag(position) over (partition by value order by cat) - position as change
from yourTable
order by
    cat, position

输出:

| cat | value | position | change |
| --- | ----- | -------- | ------ |
| 1   | A     | 1        | null   |
| 1   | B     | 2        | null   |
| 1   | C     | 3        | null   |
| 1   | D     | 4        | null   |
| 2   | C     | 1        | 2      |
| 2   | B     | 2        | 0      |
| 2   | A     | 3        | -2     |
| 2   | D     | 4        | 0      |
92vpleto

92vpleto3#

我想你只是想 lag() 用右手 partition by :

select t.*,
       (lag(position) over (partition by value order by cat) - position) as change
from t;

这是一把小提琴。

相关问题