Есть ли способ в Postgresql написать запрос, который группирует строки на основе столбца с ограничением, не отбрасывая дополнительные строки.
Скажем, у меня есть таблица с тремя столбцами id, color, score
со следующими строками
1 red 10.0
2 red 7.0
3 red 3.0
4 blue 5.0
5 green 4.0
6 blue 2.0
7 blue 1.0
Я могу получить группировку по цвету с помощью оконных функций со следующим запросом
SELECT * FROM (
SELECT id, color, score, rank()
OVER (PARTITION BY color ORDER BY score DESC)
FROM grouping_test
) AS foo WHERE rank <= 2;
с результатом
id | color | score | rank
----+-------+-------+------
4 | blue | 5.0 | 1
6 | blue | 2.0 | 2
5 | green | 4.0 | 1
1 | red | 10.0 | 1
2 | red | 7.0 | 2
который отбрасывает элемент с рангами> 2. Однако мне нужен результат вроде
1 red 10.0
2 red 7.0
4 blue 5.0
6 blue 2.0
5 green 4.0
3 red 3.0
7 blue 1.0
Без отброшенных строк.
Изменить: Чтобы быть более точным в отношении логики, которая мне нужна:
- Дайте мне строку с наивысшим баллом
- Следующий ряд с тем же цветом и максимально возможным счетом
- Элемент с наивысшим баллом из оставшихся предметов
- То же, что и 2., но для строки из 3.
...
Продолжайте до тех пор, пока можно найти пары одного цвета, а затем упорядочите то, что осталось, по убыванию.
Операторы импорта для тестовой таблицы можно найти здесь. Спасибо за вашу помощь.