SQLserver将散的数值按步长优化成几组相同的数

有这样一个需求:将散的数值按步长优化成几组相同的数
用的工具是SQL server 2016,现有模拟数据表A,一组测量数据,为了方便生产,校正为以步长为3生成尾数为0,3,6,9的尾数的几组:
A1
1001
1002
1003
1004
1004
1005
1006
1006
1006
1007
1009

通过优化,欲得到箭头后面转换成后的数,以3为步长,取大于3的倍数的最小值,向上取。
比如:(0, 1, 2, 3 )转换为3,(4, 5, 6)转换为6,(7, 8, 9)转换为9
1001->1003
1002->1003
1003->1003
1004->1006
1004->1006
1005->1006
1006->1006
1006->1006
1006->1006
1007->1006
1009->1009

img


语句:

select 
A1,'--->' ' ',
 A1/10*10 + case 
        WHEN A1%10 in(1,2,3,0) THEN 3
        WHEN A1%10 in(4,5,6 )  THEN 6
        WHEN A1%10 in(7,8,9)   THEN 9
end  result 
from (
select 1001 A1 union
select 1002 A1 union
select 1003 A1 union
select 1004 A1 union
select 1005 A1 union
select 1006 A1 union
select 1007 A1 union
select 1008 A1 union
select 1009 A1 union
select 1000 A1 union
select 1006 A1 
) A

对应curating的基础上稍调整下,创建一个辅助函数可以实现对应需求

img

img

--创建辅助函数
CREATE FUNCTION [dbo].[NumberCheck]
(
   @Q_Num int,    --原数
   @Q_n smallint  --变化步长
)
RETURNS bigint
AS 
BEGIN
    if (@Q_n<=1) return @Q_Num

    DECLARE @last_N smallint --末位数
    DECLARE @New_N smallint  --变更后的末位数
    DECLARE @v_f smallint    --依步长计算变化标识数

    set @last_N=@Q_Num%10              --末位数
    set @v_f=ceiling(@last_N*1.0/@Q_n) --逢小数取整数

    if (@last_N=9) set @New_N=@last_N  --9或0不变 依实际需求调整
    else set @New_N=@v_f*@Q_n

    RETURN @Q_Num/10*10+@New_N
END


--模拟测试
select t.变更前数值,[dbo].[NumberCheck](t.变更前数值,3) 变更后数值
from
(
  select 1001 变更前数值
  union select 1002 变更前数值
  union select 1003 变更前数值
  union select 1004 变更前数值
  union select 1005 变更前数值
  union select 1006 变更前数值
  union select 1007 变更前数值
  union select 1008 变更前数值
  union select 1009 变更前数值
) t

--测试结果
变更前数值    变更后数值
1001    1003
1002    1003
1003    1003
1004    1006
1005    1006
1006    1006
1007    1009
1008    1009

这个步长我想做成可定义的,有的时候可能是5有的时候可能是2,这个能否再优化一下