【问题标题】:SQL - LAG() Order By 2 Columns?SQL - LAG() 按 2 列排序?
【发布时间】:2018-02-03 13:01:18
【问题描述】:

是否可以按顺序使用带有 2 列的滞后?如果不是,我该怎么做?

这是我现在拥有的:

LAG(GOOD_QTY) Over (Order By SEQUENCE_NO) As Value

这是我想要的:

LAG(GOOD_QTY) Over (Order By SUB_ID DESC,SEQUENCE_NO) As Value

我需要延迟来确定 Sub_ID 的优先级,因为需要先检查所有子 ID 操作。

这是我的意思/想要的可视化。

这里是初始值/表:

SEQ_NO   SUB_ID   value  
-------------
10       0         50
30       0        200
20       0         75
25       0        100
10       1        150
20       1        250

这是在发生 2 order by 的滞后函数后我想要的

SEQ_NO   SUB_ID   value  
-------------
10       0        250
30       0        100
20       0         50
25       0        75
10       1        NULL
20       1        150

所以基本上我想对所有具有sub_id = 1 的值分别执行滞后函数,并在所有具有sub_id = 0 的值之前执行。一旦它完成了所有sub_id = 1 值,它应该继续转到sub_id = 0 值,将sub_id = 1 的最后一个值传递给sub_id = 0 的第一个seq_no

只要先弄清楚如何处理所有sub_id = 1 值,然后再处理sub_id = 0 值就足够了,我可能会弄清楚其余的。

【问题讨论】:

  • 你试过了吗?发生了什么?
  • 等等……它成功了。哈哈

标签: sql sql-server lag


【解决方案1】:

要使用lag()获得您想要的结果,您需要order by sub_id desc, seq_no

select seq_no, sub_id
  , value = lag(value) over (order by sub_id desc, seq_no)
from t
order by sub_id, seq_no

rextester 演示:http://rextester.com/YHCIOD53469

返回:

+--------+--------+-------+
| seq_no | sub_id | value |
+--------+--------+-------+
|     10 |      0 | 250   |
|     20 |      0 | 50    |
|     25 |      0 | 75    |
|     30 |      0 | 100   |
|     10 |      1 | NULL  |
|     20 |      1 | 150   |
+--------+--------+-------+

您也可以使用lead(value) over (order by sub_id, seq_no desc) 获得相同的结果。

【讨论】:

  • 哈哈谢谢。在发布这个问题之前,我可能应该先尝试一下......它的工作方式完全符合我的预期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
  • 2012-01-09
  • 1970-01-01
相关资源
最近更新 更多