根据过道方向重新组织选项列表

时间:2014-09-05 16:11:54

标签: sql sorting cursor common-table-expression picklist

因此,我将首先解释整个问题,然后解释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采取完全错误的方法,所以只要说你想到一个更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:0)

我认为你能做的就是这个。

添加只有两个值的字段sort_order

  • 1 - 适用于应按升序排序的过道
  • ( - 1) - 对于具有desc排序顺序的过道

然后,您可以使用以下查询以正确的排序顺序生成结果:

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。