seg. Тип данных для представления отрезков или интервалов чисел с плавающей точкой#
В исходном дистрибутиве установлено по умолчанию: нет.
Связанные компоненты: отсутствуют.
Схема размещения:
ext.
Модуль реализует тип данных seg для представления отрезков или интервалов чисел с плавающей точкой. Представление данных в виде интервалов, а не в виде отдельных двух чисел, на практике часто оказывается эффективней, так как снижается риск потери информации на границах числовых типов.
Например, в базу данных вводится значение 6.50. Прочитав это значение из базы, будет получен следующий результат:
SELECT 6.50 :: float8 aAS "pH";
pH
-----
6.5
(1 row)
Разница между 6.50 и 6.5 в некоторых случаях может быть критической. Запись 6.50 на самом деле представляет неточный интервал, содержащийся внутри большего и еще более неточного интервала 6.5.
Для решения этой проблемы существует специальный тип данных, в котором можно сохранить границы интервала с произвольной переменной точностью. В данном случае точность переменная в том смысле, что для каждого элемента данных она может записываться индивидуально.
Например:
select '6.25 .. 6.50'::seg as "pH";
Пример результата запроса:
pH
--------------
6.25 .. 6.50
(1 row)
Внешнее представление интервала образуется:
одним или двумя числами с плавающей точкой, соединенными оператором диапазона –
..или....;как центральная точка плюс/минус отклонение;
дополнительными индикаторами достоверности, которые игнорируются встроенными операторами
<;>;~.
Допустимые представления показаны в таблице. Cимволы x, y и delta обозначают числа с плавающей точкой. Перед значениями x и y может быть добавлен индикатор достоверности:
Представление |
Описание |
|---|---|
|
Одно значение (интервал нулевой длины) |
|
Интервал от |
|
Интервал от |
|
Открытый интервал с нижней границей |
|
Открытый интервал с верхней границей |
Допустимое значение |
Описание |
|---|---|
|
Создает сегмент нулевой длины (точка) |
|
Создает сегмент нулевой длины и записывает |
|
Создает точку с координатой |
|
Создает точку с координатой |
|
Создает интервал |
|
Все, что больше или равно |
|
Все, что меньше или равно 0 |
|
Создает интервал |
|
То же, что и |
Оператор ... часто используется в источниках данных, поэтому он принимается в качестве альтернативного написания оператора ... Это порождает неоднозначность при разборе, поскольку неясно, какая верхняя граница имеется в виду для записи 0...23 — 23 или 0.23. Для разрешения этой неоднозначности во входных числах seg перед десятичной точкой всегда должна быть минимум одна цифра.
seg не принимает интервалы с нижней границей, превышающей верхнюю, например: 5 .. 2.
Значения seg хранятся внутри как пары 32-битных чисел с плавающей точкой. Это значит, что числа с более чем 7 значащими цифрами будут усекаться.
Числа, содержащие 7 и меньше значащих цифр, сохраняют изначальную точность. Если запрос возвращает 0.00, конечные нули отражают точность исходных данных. Количество ведущих нулей не влияет на точность: значение 0.0067 будет считаться имеющим только две значащих цифры.
Модуль seg включает класс операторов индекса GiST для значений seg:
Оператор |
Тип |
Описание |
Пример |
|---|---|---|---|
|
|
Первый |
|
|
|
Первый |
|
|
|
Первый |
|
|
|
Первый |
– |
|
|
Два отрезка seg равны? |
– |
|
|
Два отрезка seg пересекаются? |
– |
|
|
Первый seg содержит второй? |
– |
|
|
Первый seg содержится во втором? |
– |
Для типа seg поддерживаются стандартные операторы сравнения, которые сначала сравнивают (a) с ©, и если они равны, сравнивают (b) с (d). Результат сравнения позволяет упорядочить значения подходящим для большинства случаев образом, что полезно для применения ORDER BY с этим типом.
Доработка#
Доработка не проводилась.
Ограничения#
Ограничения отсутствуют.
Установка#
Модуль считается «доверенным», поэтому его могут устанавливать пользователи, имеющие право CREATE в текущей базе данных:
CREATE EXTENSION seg SCHEMA ext;
Настройка#
Настройка не требуется.
Использование модуля#
Примеры использования в регрессионном тесте: https://github.com/LuaDist/libpq/blob/master/contrib/seg/sql/seg.sql
Ссылки на документацию разработчика#
Исходная документация по модулю seg: https://www.postgresql.org/docs/15/seg.html