Предположим, у меня есть такая таблица
+--------+--------+------+--------+---------+
| 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;
Или я начинаю с неправильного подхода?