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

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

假设我们有下面的输入表

  1. cat | value | position
  2. ------------------------
  3. 1 | A | 1
  4. 1 | B | 2
  5. 1 | C | 3
  6. 1 | D | 4
  7. 2 | C | 1
  8. 2 | B | 2
  9. 2 | A | 3
  10. 2 | D | 4

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

  1. cat | value | position | change
  2. ---------------------------------
  3. 1 | A | 1 | NULL
  4. 1 | B | 2 | NULL
  5. 1 | C | 3 | NULL
  6. 1 | D | 4 | NULL
  7. 2 | C | 1 | 2
  8. 2 | B | 2 | 0
  9. 2 | A | 3 | -2
  10. 2 | D | 4 | 0

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

t98cgbkg

t98cgbkg1#

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

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

nr9pn0ug2#

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

  1. select
  2. *,
  3. lag(position) over (partition by value order by cat) - position as change
  4. from yourTable
  5. order by
  6. cat, position

输出:

  1. | cat | value | position | change |
  2. | --- | ----- | -------- | ------ |
  3. | 1 | A | 1 | null |
  4. | 1 | B | 2 | null |
  5. | 1 | C | 3 | null |
  6. | 1 | D | 4 | null |
  7. | 2 | C | 1 | 2 |
  8. | 2 | B | 2 | 0 |
  9. | 2 | A | 3 | -2 |
  10. | 2 | D | 4 | 0 |
展开查看全部
92vpleto

92vpleto3#

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

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

这是一把小提琴。

相关问题