Как выбрать один столбец hstore из группы в Postgres? - PullRequest
1 голос
/ 25 сентября 2019

Предположим, у меня есть таблица foo в Postgres 11.5:

CREATE TABLE foo (an_int integer, a_varchar varchar(50));

Я могу выбрать уникальные столбцы по целому числу и получить пару значений a_varchar в качестве примеров следующим образом:

SELECT an_int,
       min(a_varchar) min_a_varchar,
       max(a_varchar) max_a_varchar
FROM foo
GROUP BY 1;

Предположим, у меня есть таблица foo2 вместо:

CREATE TABLE foo2 (an_int integer, an_hstore hstore);

Есть ли аналогичный способ выбрать одну строку для an_int и извлечь одну или несколько hstore ценности?Я попытался использовать hstore_to_json(), и это не сработало.Преобразование в varchar сработало, но я не знаю, хорошо ли это сохраняет данные.

Так что мой лучший ответ на данный момент:

SELECT an_int,
       min(an_hstore::varchar) min_an_hstore,
       max(an_hstore::varchar) max_an_hstore
FROM foo2
GROUP BY 1;

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Легко определить min и max для hstore.

Вот пример для min:

CREATE FUNCTION hstore_smaller(hstore, hstore) RETURNS hstore
   LANGUAGE sql IMMUTABLE AS
'SELECT CASE WHEN $2 IS NULL OR $1 #<# $2 THEN $1 ELSE $2 END';

CREATE AGGREGATE min(hstore) (
   STYPE = hstore,
   SFUNC = hstore_smaller
);

Тогда у вас нетиспользовать любые приведения.

0 голосов
/ 26 сентября 2019

Похоже, вы просто хотите выбрать N строк произвольно для каждого отдельного значения an_int.(Не «минимальный / максимальный hstore».)

Для 1 ряд на группу:

SELECT DISTINCT ON (an_int) an_int, an_hstore
FROM  foo2;

Для N строк:

SELECT *
FROM  (SELECT *, row_number() OVER (PARTITION BY an_int) AS rn FROM foo2) sub
WHERE  rn < 3;

Если выборка должна быть детерминированной, а не произвольной, определите критерии и добавьте соответственно ORDER BY предложенияМожет также быть «минимальным или максимальным значением hstore», так как ORDER BY an_hstore работает «из коробки» - внутренне, используя недокументированные операторы hstore, которые Лоренц использует для создания статистической функции в другом ответе, который является умным, но также медленным.

Похожие:

Оптимизация производительности для многих строк вgroup:

...