SQL - LAG()按2列排序?

时间:2017-08-25 13:00:47

标签: sql sql-server 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

这是我想要的滞后函数后发生的2阶×

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值就足够了,我可以找出其余的值。

1 个答案:

答案 0 :(得分: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)获得相同的结果。