Поделиться через


Специальный плавающий знак values

Область применения:флажок Databricks SQL флажок Databricks Runtime

Несколько специальных чисел с плавающей запятой, обозначенных как values, обрабатываются без учета регистра:

  • Inf, +Inf, Infinity, +Infinity — положительная бесконечность.
  • -Inf, -Infinity — отрицательная бесконечность.
  • NAN: не является числом

Семантика положительной и отрицательной бесконечности

Положительная и отрицательная бесконечность имеют следующую семантику:

  • Положительная бесконечность, умноженная на любое положительное значение, возвращает положительную бесконечность.
  • Отрицательная бесконечность, умноженная на любое положительное значение, возвращает отрицательную бесконечность.
  • Положительная бесконечность, умноженная на любое отрицательное значение, возвращает отрицательную бесконечность.
  • Отрицательная бесконечность, умноженная на любое отрицательное значение, возвращает положительную бесконечность.
  • Положительная или отрицательная бесконечность, умноженная на 0, возвращает значение NaN.
  • Положительная или отрицательная бесконечность равна самой себе.
  • В агрегациях все положительные бесконечности values группируются вместе. Аналогичным образом все отрицательные бесконечности values группируются вместе.
  • Положительная бесконечность и отрицательная бесконечность рассматриваются как обычные values в join ключах.
  • Положительная бесконечность сортируется ниже NaN и выше любых других values.
  • Отрицательная бесконечность располагается ниже всех остальных values.

Семантика NaN

При работе с типами float или double, которые не полностью соответствуют стандартной семантике с плавающей запятой, NaN имеет следующую семантику:

  • NaN = NaN возвращает значение true.
  • В агрегатах все NaN values группируются вместе.
  • NaN рассматривается как обычное значение в ключах join.
  • NaN values следует последним, когда числа расположены в порядке возрастания, так как он больше любого другого числового значения.

Примеры

> SELECT double('infinity');
 Infinity

> SELECT float('-inf');
 -Infinity

> SELECT float('NaN');
 NaN

> SELECT double('infinity') * 0;
 NaN

> SELECT double('-infinity') * (-1234567);
 Infinity

> SELECT double('infinity') < double('NaN');
 true

> SELECT double('NaN') = double('NaN');
 true

> SELECT double('inf') = double('infinity');
 true

> SELECT COUNT(*), c2
    FROM VALUES (1, double('infinity')),
                (2, double('infinity')),
                (3, double('inf')),
                (4, double('-inf')),
                (5, double('NaN')),
                (6, double('NaN')),
                (7, double('-infinity'))
        AS test(c1, c2)
    GROUP BY c2;
        2       NaN
        2 -Infinity
        3  Infinity