我有两列如下:
A | B
0.33 | 0.55
0.44 | 0.65
10 | 20
10.1 | 10.234
11.236 | 12.8963
12 | 30
30.5698| 35.6893
在以上各列中,应将带小数的值乘以100,以将其转换为整数,并且由于格式正确,因此请勿干扰整数。
使用转换后的整数,计算列的差。
所以我尝试了蜂巢式的MOD函数。
但是使用此功能,整数的差是正确的。但是小数位的区别是错误的。
我不知道我要去哪里错了。
我尝试了以下代码:
从样本中选择mod(B,100)-mod(A,100)
实际结果是:
A | B | C
0.33 | 0.55 | 22
0.44 | 0.65 | 21
10 | 20 | 10
10.1 | 10.234 | 13
11.236 | 12.8963| 166
12 | 30 | 18
30.5698| 35.6893| 512
答案 0 :(得分:0)
A和B是什么数据类型? 如果将它们定义为小数,则所有值将具有相同的精度:
create table temp.table_name (
A decimal(10,5)
,B decimal(10,5)
)
stored as parquet location '../temp.db/table_name'
;
INSERT INTO TABLE temp.table_name
VALUES (0.33 ,0.55)
,(0.44 ,0.65)
,(10 ,20)
,(10.1 ,10.234)
,(11.236 ,12.8963)
,(12 ,30)
,(30.5698,35.6893);
选择结果(所有数据具有相同的精度):
+---------------+---------------+--+
| table_name.a | table_name.b |
+---------------+---------------+--+
| 0.33000 | 0.55000 |
| 0.44000 | 0.65000 |
| 10.00000 | 20.00000 |
| 10.10000 | 10.23400 |
| 11.23600 | 12.89630 |
| 12.00000 | 30.00000 |
| 30.56980 | 35.68930 |
+---------------+---------------+--+
选择以获取小数位差:
select a ,b ,( cast(round((b*100),0) as int) -
cast(round((a*100),0) as int)) as res
from temp.table_name;
结果-小数位数之差:
+-----------+-----------+-------+--+
| a | b | res |
+-----------+-----------+-------+--+
| 0.33000 | 0.55000 | 22 |
| 0.44000 | 0.65000 | 21 |
| 10.00000 | 20.00000 | 1000 |
| 10.10000 | 10.23400 | 13 |
| 11.23600 | 12.89630 | 166 |
| 12.00000 | 30.00000 | 1800 |
| 30.56980 | 35.68930 | 512 |
+-----------+-----------+-------+--+
希望可以为您提供帮助。