Ограничить набор данных максимумом группы - PullRequest
0 голосов
/ 03 апреля 2020

В postgres sql как бы вы провели анализ, который включает в себя подсчет по группам (2 столбца), но ограничивает вывод набора данных максимумом x строк группы только по 1 столбцу?

| Groupby_1 | Groupby_2 |
|-----------|-----------|
| a         | x         |
| a         | y         |
| b         | x         |
| b         | x         |
| b         | z         |

Ожидаемый результат до ограничения

| Groupby_1 | Groupby_2 | Count |
|-----------|-----------|-------|
| a         | x         | 1     |
| a         | y         | 1     |
| b         | x         | 2     |
| b         | z         | 1     |

Пост-ограничение по сумме (количеству) за groupby_1 Limit 1

| Groupby_1 | Groupby_2 | Count |
|-----------|-----------|-------|
| b         | x         | 2     |
| b         | z         | 1     |

Выход ограничен данными из вторая таблица, где group_by над groupby_1 является самой большой, но она по-прежнему отображает все связанные строки для b из второй таблицы

Я думал, что приведенное ниже приблизит меня, но это не даст мне эквивалентную таблицу из 2 Я просто получаю сумму счета по groupby_1.

SELCT SUM(count) AS sum_count, groupby_1
FROM (
   SELECT
   COUNT(*) as count, groupby_1, groupby_2
   FROM table
   GROUP BY groupby_1, groupby_2
) ab
GROUP BY groupby_1

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 03 апреля 2020

Использование оконных функций с агрегацией:

SELECT ab.*  -- or whatever columns you want
FROM (SELECT ab.*,
             DENSE_RANK() OVER (ORDER BY groupby_1_cnt DESC, groupby_1) as seqnum
      FROM (SELECT groupby_1, groupby_2, COUNT(*) as cnt,
                 SUM(COUNT(*)) OVER (groupby_1) as groupby_1_cnt
            FROM table
            GROUP BY groupby_1, groupby_2
           ) ab
    ) ab
WHERE seqnum = 1;

В качестве альтернативы вы можете использовать предложение HAVING:

SELECT groupby_1, groupby_2, COUNT(*) as cnt
FROM table
GROUP BY groupby_1, groupby_2
HAVING groupby_1 = (SELECT groupby_1
                    FROM table
                    GROUP BY groupby_1
                    ORDER BY COUNT(*) DESC
                    LIMIT 1
                   );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...