Как я могу использовать предложение PostgreSQL DISTINCT ON, чтобы также возвращать количество дубликатов? - PullRequest
0 голосов
/ 29 ноября 2018

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

+--------+--------+------+--------+---------+
|   A    |   B    |  C   |   g    |    h    |
+--------+--------+------+--------+---------+
| cat    | dog    | bird | 34.223 |  54.223 |
| cat    | pigeon | goat |  23.23 |  54.948 |
| cat    | dog    | bird | 17.386 |  26.398 |
| gopher | pigeon | bird | 23.552 |  89.223 |
+--------+--------+------+--------+---------+

, но со многими полями справа (i, j, k, ...).

Мне нужна результирующая таблицаэто выглядит так:

+-----+--------+------+-----+-----+-----+-----+-------+
|  A  |   B    |  C   |  g  |  h  | ... |  z  | count |
+-----+--------+------+-----+-----+-----+-----+-------+
| cat | dog    | bird | xxx | xxx |     | xxx |    23 |
| cat | pigeon | goat | xxx | xxx |     | xxx |    78 |
+-----+--------+------+-----+-----+-----+-----+-------+

Я бы обычно использовал GROUP BY, но я не хочу повторять все имена столбцов (g, h, i, ... z).

В настоящее время я могу получить желаемый результат, используя оконную функцию в сочетании с DISTINCT ON, но запрос выполняется очень медленно (500k + записей) и имеет много дубликатов

WITH temp AS (
    SELECT a, b, c, COUNT(*)
    FROM my_table
    GROUP BY a, b, C
)
SELECT DISTINCT ON (a, b, c) *, (
    SELECT count
    FROM temp
    WHERE 
        temp.a = t.a 
        AND temp.b = t.b 
        AND temp.c = t.c
) as count
FROM my_table as t
ORDER BY a, b, c, x, y;

Есть ли способ как-нибудь более эффективно подсчитать количество строк, выделенных с помощью DISTINCT?Что-то вроде

SELECT DISTINCT ON (a, b, c)
    *, COUNT(*)
FROM my_table
ORDER BY a, b, c, count;

Или я начинаю с неправильного подхода?

1 Ответ

0 голосов
/ 29 ноября 2018

Используйте COUNT() с PARTITION BY:

SELECT DISTINCT ON (a, b, c) *, COUNT(*) OVER (PARTITION BY a, b, c)
FROM my_table

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

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