Содержание

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

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

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

Практическое применение RETURNING

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

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

Решение 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