Дублируются значения при сортировке окон SQL

Работаю с запросом в базу данных. Необходимо разбить всю таблицу на группы с группировкой по столбцу finis. Решил данный вопрос при помощи partition by. Далее из получившихся окон выбираю не больше трёх значений отсортированных по столбцу price. Далее мне необходимо отсортировать по минимальной priceсами окна. Максимум чего добился - сортировка производится, но окна при этом дублируются. Думаю это происходит из-за пересекающихся диапазонов значений price между окнами. Есть ли возможность решить эту проблему?

SELECT * FROM ( 

    *# определяю окна, которые группируются по finis и сортируются по price*

    SELECT *, row_number() over (PARTITION BY finis ORDER BY price ASC) AS num 
    FROM Parts WHERE originality=%s )

    # из каждого окна выбираю по 3 строки c наименьшей ценой и сортирую их по цене

WHERE num <=3 ORDER BY price, num = 1 ASC;

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Akina
WITH
cte1 AS ( SELECT *, 
                 ROW_NUMBER() OVER (PARTITION BY finis ORDER BY price ASC) AS num
          FROM Parts 
          WHERE originality=%s ),
cte2 AS ( SELECT *,
                 MIN(price) OVER (PARTITION BY finis) minprice
          FROM cte1
          WHERE num <=3 )
SELECT * 
FROM cte2
ORDER BY minprice, num, price;

Первый CTE нумерует записи в группе.

Второй - оставляет по 3 записи на группу и считает минимальную цену в группе.

Основной запрос сортирует. Сначала по минимальной цене (она для всей группы одна и та же), затем по группе (вдруг у двух групп одинаковая минимальная цена - перемешаются ить), ну и потом уже в каждой группе по цене.

В принципе можно и одним CTE обойтись:

WITH
cte AS ( SELECT *, 
                ROW_NUMBER() OVER (PARTITION BY finis ORDER BY price ASC) AS num
         FROM Parts 
         WHERE originality=%s )
SELECT *
FROM cte
WHERE num <=3
ORDER BY MIN(price) OVER (PARTITION BY finis), num, price;

но лично у меня душа не лежит к оконным функциям в ORDER BY...

→ Ссылка