2017-08-25 42 views
0

是否有可能按顺序使用2列的滞后?如果不是,我会如何去做这件事?SQL - LAG()按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 

下面是发生

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

所以基本上我想要做的滞后函数与我有2阶滞后功能之后要所有值分别具有sub_id = 1和所有值为sub_id = 0。一旦它所做的一切sub_id = 1值应该继续去sub_id = 0值传递的最后一个值从sub_id = 1到第一seq_no与sub_id = 0

刚刚搞清楚如何先做所有sub_id = 1值,然后做sub_id = 0值好足够了,我可以弄清楚其余的可能。

+0

你试过了吗?发生了什么? – JohnHC

+1

等等......它的工作。 LOL – Azuraith

回答

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)相同的结果。

+0

LOL谢谢。我可能应该在发布这个问题之前先尝试这个方法......它的工作原理与我所期望的完全一样。 – Azuraith

+0

@Azuraith这是最好的行动方案,是的。 – SqlZim