因此,我将首先解释整个问题,然后解释SQL编码中的问题所在。
我有一组数据是通过仓库的选项列表,我实际上是在尝试重新组织这些数据,以便在每个过道中遵循一个方向。
所以例如,这是一个选项列表
tripid stopseq AISLE bin
216 1 PV 71
216 2 PM 64
216 3 PL 47
216 4 PM 36
216 5 PL 32
216 6 PL 88
216 7 PJ 49
216 8 PJ 29
216 9 PJ 20
216 10 PJ 19
216 11 PI 22
216 12 PI 45
216 13 PN 33
216 14 PN 28
因为过道只能走一条路,有些正在上升,有些正在下降
在这种情况下,我想重新组织这个表,以便过道PJ升序(选择7,8,9,10) 所以我希望它能够通过选项列表并根据过道升序或降序重新排序序列。我将只关注这个例子中的一个过道,所以我正在寻找一个循环遍历表的查询,并用列PJ重新组织记录,以便顺序相反。类似于
216 7 PJ 19
216 8 PJ 20
216 9 PJ 29
216 10 PJ 49
但我现在只想影响这些行。 到目前为止,我已经创建了一个游标,里面有一个CTE。像这样的东西。
declare inner_cursor cursor scroll
for select aisle from table_input
open inner_cursor
fetch next from inner_cursor into @aisle
while @@fetch_status = 0
begin
if @aisle in ('PJ')
begin
with C as
(select stopseq, 0 + row_number() over (order by bin desc) as newtripstop
from SIM_Input_reschedule
)
update C
set tripstopseq = newtripstop
end
但是这只会按Bin号排序整个列表,所以我尝试为过道添加一个约束 通过添加
begin
with C as
(select tripstopseq, 0 + row_number() over (order by bin asc) as newtripstop, aisle
from SIM_Input_reschedule
where AISLE = @aisle
)
update C
set tripstopseq = newtripstop
end
但是这不会影响表中的行。任何帮助表示赞赏。我可能一直对CTE采取完全错误的方法,所以只要说你想到一个更好的方法来做到这一点。
答案 0 :(得分:0)
我认为你能做的就是这个。
添加只有两个值的字段sort_order
:
然后,您可以使用以下查询以正确的排序顺序生成结果:
SELECT aisle, bin,
( SELECT MAX(sequence) FROM myTable
WHERE t.aisle != aisle and sequence < t.sequence)
+ ROW_NUMBER() OVER(PARTITION BY aisle ORDER BY sort_order * bin) as newsequence
FROM myTable t
要在没有新字段的情况下执行此操作,您必须使用具有相同逻辑的CASE WHEN。