Преобразуйте десятичные дроби в целые числа и найдите разницу между двумя столбцами - PullRequest
0 голосов
/ 17 июня 2019

У меня есть два столбца, как показано ниже:

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.

Но при использовании этой функции разница целых чисел верна. Но разница десятичных знаков неверна.

Я не знаю, где я иду не так.

Я попробовал следующий код:

выберите мод (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

1 Ответ

0 голосов
/ 04 июля 2019

Какой тип данных 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   |
+-----------+-----------+-------+--+

Надеюсь, это поможет вам.

...