问题

分布分析中需要根据某一步长对一组值进行区间划分,且其包含正负数。

假设当前待分组值为 [-11, -9, -7, -3, 1, 3, 5, 7, 9, 11],以 5 为步长,
正常思路对 当前值 - (当前值 求余 步长) 后的值作为区间的起点,如下所示,

with 5 as step,
[-11, -9, -7, -3, 1, 3, 5, 7, 9, 11] as nums
select arrayJoin(nums) as num, num - num % step as value1;

    ┌─num─┬─value1─┐
 1. │ -11-102. │  -9-53. │  -7-54. │  -305. │   106. │   307. │   558. │   759. │   9510. │  1110 │
    └─────┴────────┘

发现这个结果不对,

  1. 在 0 值附近,整数和负数的值都落在了 0 值点
  2. 负数代表区间上限,而正数代表的是区间下限

那么要如何解决呢,
可以对负数再多减去一个步长,就能解决正负数上下限问题,且零值区间也可以区分,
如下所示,

with 5 as step,
[-11, -9, -7, -3, 1, 3, 5, 7, 9, 11] as nums
select arrayJoin(nums) as num, num - num % step as value1, 
if(num >= 0, num - num % step, num - num % step - step) as value2;

    ┌─num─┬─value1─┬─value2─┐
 1. │ -11-10-152. │  -9-5-103. │  -7-5-104. │  -30-55. │   1006. │   3007. │   5558. │   7559. │   95510. │  111010 │
    └─────┴────────┴────────┘