Как получить идентификаторы сгруппированных по строкам в postgresql и использовать результат? - PullRequest
0 голосов
/ 11 октября 2019

У меня есть таблица, содержащая транзакции с суммой. Я хочу создать пакет транзакций, чтобы сумма суммы каждой «группы по» была отрицательной. Моя проблема состоит в том, чтобы получить все идентификаторы строк, относящихся к «group by», где каждая группа проверяется условием суммы.

Я нахожу много решений, которые не работают для меня. Лучшее решение, которое я нашел, - это запросить БД в первый раз с 'group by' и суммой, а затем вернуть идентификаторы, чтобы, наконец, запросить БД в другой раз со всеми ними.

Вот пример того, что яхотел бы (это не работает!):

SELECT * FROM transaction_table transaction 
AND transaction.id IN (
    select string_agg(grouped::character varying, ',' ) from (
        SELECT array_agg(transaction2.id) as grouped FROM transaction_table transaction2 
        WHERE transaction2.c_scte='c'
        AND (same conditions)
        GROUP BY
            transaction2.motto ,
            transaction2.accountBnf ,
            transaction2.payment ,
            transaction2.accountClt 
        HAVING sum(transaction2.amount)<0
    )
);

результат array_agg выглядит так:

{39758,39759}
{39757,39756,39755,39743,39727,39713}

, а string_agg:

{39758,39759},{39757,39756,39755,39743,39727,39713}

Теперь мне просто нужно их использовать, но я не знаю, как ...

к сожалению, это не работает из-за приведения типов:

ERROR: operator does not exist: integer = integer[]
  Indice : No operator matches the given name and argument type(s). You might need to add explicit type casts.

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Наконец я нашел эту опцию, используя метод «unnest». Это работает отлично.

  • Array_agg объединяет все идентификаторы в различном массиве
  • unnest сведены все из них

Это происходит от здесь

SELECT * FROM transaction_table transaction 
WHERE transaction.id = ANY(
    SELECT unnest(array_agg(transaction2.id)) as grouped FROM transaction_table transaction2 
    WHERE transaction2.c_scte='c'
    AND (same conditions)
    GROUP BY
        transaction2.motto ,
        transaction2.accountBnf ,
        transaction2.payment ,
        transaction2.accountClt 
    HAVING sum(transaction2.amount)<0
);

Проблема этого решения заключается в том, что hibernate не учитывает метод array_agg.

0 голосов
/ 11 октября 2019

Может быть, вы ищете

SELECT id, motto, accountbnf, payment, accountclnt, amount
FROM (SELECT id, motto, accountbnf, payment, accountclnt, amount,
             sum(amount)
                OVER (PARTITION BY motto, accountbnf, payment, accountclnt)
                AS group_total
      FROM transaction_table) AS q
WHERE group_total < 0;

Внутренний SELECT добавляет дополнительный столбец, используя оконную функцию, которая вычисляет сумму для каждой группы, а внешний запрос удаляет все результаты, где эта сумма неотрицательный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...