Как я могу получить идентификаторы строк, которые составляют запрос GROUP BY ... HAVING? - PullRequest
0 голосов
/ 22 сентября 2009

У меня есть следующий запрос, который ищет транзакции, которые отменяют себя от одного и того же клиента (некоторые транзакции отрицательны).

SELECT c, ABS(r) magnitude, SUM(r) total, COUNT(*) num
FROM table
GROUP BY c, magnitude
HAVING num > 1 AND total = 0
ORDER BY total

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

Как мне получить идентификаторы строк, составляющих COUNT(*)?

Я хотел бы в итоге получить набор результатов из одного столбца, который содержит идентификаторы этих строк.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2009
SELECT  id
FROM    (
        SELECT  c, ABS(r) magnitude, SUM(r) total, COUNT(*) num
        FROM    table
        GROUP BY
                c, magnitude
        HAVING num > 1 AND total = 0
        ) td
JOIN    table to
ON      to.c = td.c
        AND to.r IN (magnitude, -magnitude)

Создание индекса на (c, r) улучшит этот запрос.

В SQL Server, Oracle и PostgreSQL 8.4 вы также можете сделать следующее:

SELECT  id
FROM    (
        SELECT  id,
                SUM(r) OVER (PARTITION BY c, ABS(r)) total,
                COUNT(*) OVER (PARTITION BY c, ABS(r)) num
        FROM    table
        ) q
WHERE   num > 1 AND total = 0
0 голосов
/ 22 сентября 2009

Почему-то мне показалось, что в тегах написано MySQL. Я довольно тупой.


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

На самом деле это было бы бесполезно ни для кого, кроме человека, читающего список. Если вы хотите выполнить больше запросов или вычислений на основе результата, это не очень хороший вариант.

Но в принципе вы могли бы сделать что-то вроде этого:

SELECT c, ABS(r) magnitude, SUM(r) total, COUNT(*) num,
  GROUP_CONCAT(ID SEPARATOR ', ') id_list
FROM table
GROUP BY c, magnitude
HAVING num > 1 AND total = 0
ORDER BY total
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...