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

Posted

技术标签:

【中文标题】使用具有更高偏移量的 LAG 函数【英文标题】:Using LAG function with higher offset 【发布时间】:2020-07-16 00:06:14 【问题描述】:

假设我们有如下输入表

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

如您所见,每个category 中的A,B,C,D 值更改position,我想通过在每个value 前面添加一列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,因此具有 change2。我尝试使用偏移量为 4 的 LAG() 函数来实现它,但我失败了,我该如何编写这个查询。

【问题讨论】:

请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange (SE) 网络上发帖,您已根据 CC BY-SA license 授予 SE 分发内容的不可撤销权利(即无论您未来的选择如何)。根据 SE 政策,分发非破坏版本。因此,任何破坏行为都将被撤销。请参阅:How does deleting work? …。如果允许删除,则帖子下方左侧有一个“删除”按钮,但仅在浏览器中,而不是移动应用程序中。 【参考方案1】:

使用lag() - 使用正确的partition by 子句:

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

【讨论】:

【参考方案2】:

您可以使用lag,然后使用order by 来保持原始顺序。这是demo。

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      |

【讨论】:

【参考方案3】:

我想你只想要lag() 和正确的partition by

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

这是一个 dbfiddle。

【讨论】:

@LaurenzAlbe 。 . .不(但减法方向错误)。列的命名有点晦涩:cat 是一个数字,value 是一个字符串。

以上是关于使用具有更高偏移量的 LAG 函数的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE 偏移分析函数 lag()与lead() 用法

ORACLE 偏移分析函数 lag()与lead() 用法

具有限制和偏移量的 CodeIgniter sql 查询未显示结果

在javascript中对具有偏移量的对象数组进行排序

具有自定义数据源偏移量的 Android 分页库 RecyclerView 中的项目

是否有返回 TimeZone 或基于坐标的偏移量的函数?