Содержание

Предыдущий раздел

Групповая обработка данных с использованием window-функций first_value/last_value

Следующий раздел

Различия в работе volatile и stable функций

Получение максимального или минимального значения из набора данных

Часто бывает надо получить максимальное или минимальное значение из набора данных. Есть два решения, которые можно использовать в том или ином случае.

Решение 1 (для массивов)

Надо оформить набор значений в виде массива и получить искомое значение запросом с использование агрегирующей функции min или max:

SELECT max(el) FROM unnest(array[2,3,1,7,4]) AS el;

 max
-----
   7
(1 row)

Данное значение очень громоздкое, но, наверное, одно из самых быстрых решения данной задачи.

Решение 2. Использовать встроенные функции greatest/least

В PostgreSQL существуют встроенные функции, которые принимают на вход произвольный набор параметров и возвращают либо минимальное, либо максимальное значение из этого набора:

SELECT least(2,3,1,7,4);
 least
-------
     1
(1 row)
SELECT greatest(2,3,1,7,4);
 greatest
----------
        7
(1 row)

Трюки для разработчиков

least или greatest может заменить громоздкие конструкции CASE WHEN

WITH tbl AS (SELECT 1 AS a, 2 AS b UNION SELECT 4, 3)
SELECT *, CASE WHEN a > b THEN a ELSE b END AS max_value FROM tbl;

 a | b | max_value
---+---+-----------
 1 | 2 |         2
 4 | 3 |         4
(2 rows)

WITH tbl AS (SELECT 1 AS a, 2 AS b UNION SELECT 4, 3)
SELECT *, greatest(a, b) AS max_value FROM tbl;       -- Замена CASE WHEN на GREATEST сделал записис более короткой и понятной

 a | b | max_value
---+---+-----------
 1 | 2 |         2
 4 | 3 |         4
(2 rows)

и IF THEN ELSE

CREATE OR REPLACE FUNCTION max(_a int4, _b int4) RETURNS int4 AS
$$
BEGIN
  IF _a > _b THEN
    RETURN _a;
  ELSE
    RETURN _b;
  END IF;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION max(_a int4, _b int4) RETURNS int4 AS
$$
    SELECT greatest(_a, _b); -- Лакончиность и простота
$$ LANGUAGE sql;
comments powered by Disqus