Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用更高偏移量的滞后函数_Sql_Database_Postgresql_Window Functions - Fatal编程技术网

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      |