TSQL索引奇偶序列步骤

时间:2018-08-20 08:57:59

标签: sql sql-server tsql

我要使用T-SQL解决严重的工业控制问题。

目标是为位于两个范围之一中的两个托盘装载机器人分别计算索引位置; 2至78(机器人1)和4至80(机器人2)。

每个机器人的步调为4,因此可以完全覆盖托盘上的80个点。机器人沿着托盘移动时,它们以最小2个点的间距并排工作。

可以在托盘上放置两个大小的盒子,一个盒子的长度是另一个盒子的两倍。如果两个小盒子并排放置,每个小盒子占据1个斑点,则可以在顶部放置一个大盒子,占据2个斑点直到达到最大高度。因此,小盒子的点数总是奇数,大盒子的点数总是偶数,而机器人索引号总是偶数。例如(请参见图)从分度位置开始加载点13和15,可以从分度20加载点19和21。

Robot Index Positions

我需要一个转换公式来计算给定Spot和Robot的索引号。

计算出的“索引”列应如下所示:

Spot Robot Index
1     1     2
2     1     2
3     1     2
-     -     - 
13    1    14
14    1    14
15    1    14
16    2    16
17    2    16
18    1    18
19    2    20
-    -    -
-    -    -
77    1    78
78    1    78
79    2    80
80    2    80

一种方法是使用简单的CASE WHEN选择,使用Spot和Robot的每种可能组合对Index列进行更新,或者对包含每种可能组合的参考表进行查找。我想探索的(如果有任何数学向导的话!)是一个计算Index值的数学公式。

到目前为止,我已经通过转换为在Excel中使用而开发的公式提出了以下建议。机械手2部分不完整。 95到99的值用于错误检查。

UPDATE MovesTable SET [Index] = 
                CASE 
                WHEN Robot = 1 THEN 
                        CASE 
                        WHEN Spot%4 = 0 THEN '99'
                        WHEN Spot = 1 or Spot = 2 or Spot = 3  THEN '02'
                        WHEN Spot = 5 or Spot = 6 or Spot = 7  THEN '06'
                        WHEN Spot = 9 or Spot = 10 or Spot = 11  THEN '10'
                        WHEN Spot%10 = 4 THEN CONCAT(Spot/10,'4')                                                                               
                        WHEN Spot < 57 AND (((Spot/10)%2 = 1 AND (Spot%10)%2 = 1) AND (Spot%10 = 3 OR Spot%10 = 5)) THEN CONCAT(Spot/10,'4')
                        WHEN Spot%10 = 8  THEN CONCAT(Spot/10,'8')                                                                          
                        WHEN Spot < 57 AND (((Spot/10)%2 = 1 AND (Spot%10)%2 = 1) AND (Spot%10 = 7 OR Spot%10 = 9)) THEN CONCAT(Spot/10,'8')
                        WHEN Spot%10 = 2  THEN CONCAT(Spot/10,'2')                                                                      
                        WHEN Spot < 57 AND (((Spot/10)%2 = 1 AND (Spot%10)%2 = 0) AND (Spot%10 = 1 OR Spot%10 = 3)) THEN CONCAT(Spot/10,'2')
                        WHEN Spot%10 = 6  THEN CONCAT(Spot/10,'6')                                                                          
                        WHEN Spot < 57 AND (((Spot/10)%2 = 0 AND (Spot%10)%2 = 1) AND (Spot%10 = 5 OR Spot%10 = 7)) THEN CONCAT(Spot/10,'6')    
                        WHEN Spot%10 = 0  THEN CONCAT(Spot/10,'')   
                        WHEN Spot = 49  THEN '50' 
                        WHEN Spot < 57 AND (((Spot/10)%2 = 0 AND (Spot%10)%2 = 1) AND Spot%10 = 9)   THEN '30'                                  
                        WHEN Spot < 57 AND (((Spot/10)%2 = 1 AND (Spot%10)%2 = 1) AND Spot%10 = 1)   THEN CONCAT(Spot/10,'0')                   
                        WHEN Spot > 56 AND (((Spot/10)%2 = 1 AND (Spot%10)%2 = 1) AND (Spot%10 = 7 OR Spot%10 = 9)) THEN CONCAT(Spot/10,'8')        
                        WHEN Spot > 56 AND (((Spot/10)%2 = 0 AND (Spot%10)%2 = 1) AND (Spot%10 = 1 OR Spot%10 = 3)) THEN CONCAT(Spot/10,'2')    
                        WHEN Spot > 56 AND (((Spot/10)%2 = 0 AND (Spot%10)%2 = 1) AND (Spot%10 = 5 OR Spot%10 = 7)) THEN CONCAT(Spot/10,'6')     
                        ELSE '98'
                        END 
                ELSE 
                    CASE 
                    WHEN Robot = 2 THEN 
                        CASE
                        WHEN (Spot%2 = 0 AND Spot%4 <> 0) OR (Spot = 1 OR Spot = 2) THEN '97' 
                        WHEN Spot = 4 then '04'
                        WHEN Spot = 8  then '08'    
                        WHEN Spot%4 = 0 THEN Spot   
                        WHEN Spot = 2  OR Spot = 5  THEN '05'
                        WHEN Spot = 7  OR Spot = 9  THEN '08'   
                        WHEN Spot = 19  THEN '20'
                        WHEN Spot = 39  THEN '40'
                        WHEN Spot = 59  THEN '60'
                        ELSE '96'
                        END
                    ELSE '95'
                    END
                END

1 个答案:

答案 0 :(得分:0)

我尝试通过数学方式解决此问题,而不是通过分析案例等来解决。它与您的所有示例结果都匹配:

declare @t table (Spot int, Robot int, [Index] int)
insert into @t(Spot,Robot,[Index]) values
(1     ,1    , 2 ),
(2     ,1    , 2 ),
(3     ,1    , 2 ),
(13    ,1    ,14 ),
(14    ,1    ,14 ),
(15    ,1    ,14 ),
(16    ,2    ,16 ),
(17    ,2    ,16 ),
(18    ,1    ,18 ),
(19    ,2    ,20 ),
(77    ,1    ,78 ),
(78    ,1    ,78 ),
(79    ,2    ,80 ),
(80    ,2    ,80 )

select *,
CONVERT(int,
ROUND((Spot +
  CASE WHEN Robot = 1 THEN 2 ELSE 0 END
)/4.0,0)* 4 -
  CASE WHEN Robot = 1 THEN 2 ELSE 0 END
) as Index2
from @t

逻辑是“四舍五入到最接近的整数倍”,但是我们使用了两个表达式将Robot 1的结果偏移2。

结果:

Spot        Robot       Index       Index2
----------- ----------- ----------- -----------
1           1           2           2
2           1           2           2
3           1           2           2
13          1           14          14
14          1           14          14
15          1           14          14
16          2           16          16
17          2           16          16
18          1           18          18
19          2           20          20
77          1           78          78
78          1           78          78
79          2           80          80
80          2           80          80