Sql 使用更高偏移量的滞后函数
假设我们有下面的输入表Sql 使用更高偏移量的滞后函数,sql,database,postgresql,window-functions,Sql,Database,Postgresql,Window Functions,假设我们有下面的输入表 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改变位置,我想通过在每个值前面添
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
改变位置
,我想通过在每个值
前面添加一列change
来跟踪此变化,输出应如下所示:
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
在类别1
中处于位置3
,在类别2中移动到位置1
,因此有更改2
。我尝试使用偏移量为4的LAG()
函数来实现此查询,但失败了,我如何编写此查询。使用LAG()
-使用适当的分区by
子句:
select
t.*,
lag(position) over(partition by value order by cat) - position change
from mytable t
我想您只需要将lag()
与正确的分区一起使用
:
select t.*,
(lag(position) over (partition by value order by cat) - position) as change
from t;
这是一个数据小提琴。您可以使用lag
,然后使用orderby
来维持原始顺序。这是你的电话号码
输出:
| 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 |
请不要破坏你的帖子,为别人做更多的工作。通过在Stack Exchange(SE)网络上发布,您已经在a下授予SE分发内容的不可撤销权利(即,无论您未来的选择如何)。根据SE政策,分发非故意破坏版本。因此,任何故意破坏行为都将恢复原状。请参阅:。如果允许删除,在帖子下方左侧有一个“删除”按钮,但它仅在浏览器中,而不是在移动应用程序中。@LaurenzAlbe。没有(但是减法的方向错了)。列的命名有点神秘:cat
是一个数字,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 |