问题
分布分析中需要根据某一步长对一组值进行区间划分,且其包含正负数。
假设当前待分组值为 [-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 │ -10 │
2. │ -9 │ -5 │
3. │ -7 │ -5 │
4. │ -3 │ 0 │
5. │ 1 │ 0 │
6. │ 3 │ 0 │
7. │ 5 │ 5 │
8. │ 7 │ 5 │
9. │ 9 │ 5 │
10. │ 11 │ 10 │
└─────┴────────┘
发现这个结果不对,
- 在 0 值附近,整数和负数的值都落在了 0 值点
- 负数代表区间上限,而正数代表的是区间下限
那么要如何解决呢,
可以对负数再多减去一个步长,就能解决正负数上下限问题,且零值区间也可以区分,
如下所示,
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 │ -15 │
2. │ -9 │ -5 │ -10 │
3. │ -7 │ -5 │ -10 │
4. │ -3 │ 0 │ -5 │
5. │ 1 │ 0 │ 0 │
6. │ 3 │ 0 │ 0 │
7. │ 5 │ 5 │ 5 │
8. │ 7 │ 5 │ 5 │
9. │ 9 │ 5 │ 5 │
10. │ 11 │ 10 │ 10 │
└─────┴────────┴────────┘