Archive

Archive for June, 2013

Arrondi au plus proche sous Teradata

June 30th, 2013 No comments

Arrondir un nombre au plus proche sous Teradata est relativement simple au premier abord.

S’il s’agit d’arrondir à l’entier on pourra utiliser :

SELECT CAST(1.2345 AS DECIMAL(2,0)) –> 1

Pour arrondir à deux décimales, on utilisera :

SELECT CAST(1.2345 AS DECIMAL(5,2)) –> 1.23

Mais la résolution de l’arrondi au plus proche se révèle plus surprenante quand le nombre est équidistant de l’arrondi supérieur et de l’arrondi inférieur.

En effet, contrairement à la plupart des systèmes sur le marché (de Excel à Oracle en passant par SSIS ou MySql), sous Teradata l’arrondi d’un nombre équidistant de ses arrondis inférieurs et supérieurs ne se fait pas systématiquement vers le supérieur mais dépend de la parité du dernier chiffre avant troncature.

Ainsi obtiendra-t-on :

SELECT CAST(1.2345 AS DECIMAL(5,3)) –> 1.234

SELECT CAST(4.5 AS DECIMAL(2,0)) –> 4

Alors que :

SELECT CAST(1.2335 AS DECIMAL(5,3)) –> 1.234

SELECT CAST(3.5 AS DECIMAL(2,0)) –> 4

C’est à dire que si le dernier chiffre avant troncature (en rouge dans l’exemple) est pair , le nombre sera arrondi à l’inférieur. Si ce dernier chiffre est impair, le nombre sera arrondi au supérieur.

En clair, Teradata a pris le parti de répartir l’approximation de l’arrondi équidistant entre le supérieur et l’inférieur.

Conclusion :

Si ce comportement est particulièrement perturbant parce qu’il va à l’encontre de 80% des systèmes sur le marché, il peut être expliqué par le besoin de lisser l’erreur d’approximation lorsque l’on traite une très forte volumétrie de données.

A noter enfin qu’Informatica PowerCenter prend le contrepied en arrondissant les pairs au supérieur et les impairs à l’inférieur.