使用具有更高偏移量的 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
,因此具有 change
的 2
。我尝试使用偏移量为 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 函数的主要内容,如果未能解决你的问题,请参考以下文章
具有限制和偏移量的 CodeIgniter sql 查询未显示结果