Мне нужно посчитать среднюю цену и сгруппировать их по 2 колонкам.Затем выберите 2 верхних значения (PostgreSQL 10.1).Например, у меня есть следующие структуры:
------------------------------------------------------------------------------------------
category | shop_name | price | date |
MSI GeForce RTX 2080 |amazon | 62649 | 1/6/2019 |
MSI GeForce RTX 2080 |amazon | 58668 | 1/17/2019 |
MSI GeForce RTX 2080 |amazon | 62649 | 1/7/2019 |
MSI GeForce RTX 2080 |amazon | 60542 | 1/16/2019 |
MSI GeForce RTX 2080 |amazon | 62649 | 1/5/2019 |
MSI GeForce RTX 2080 |brandstar | 66456 | 1/16/2019 |
MSI GeForce RTX 2080 |brandstar | 66347 | 1/17/2019 |
MSI GeForce RTX 2080 |brandstar | 66456 | 1/16/2019 |
MSI GeForce RTX 2080 |brigo | 63300 | 1/17/2019 |
MSI GeForce RTX 2080 |brigo | 65330 | 1/16/2019 |
MSI GeForce RTX 2080 |brigo | 65330 | 1/16/2019 |
MSI GeForce RTX 2070 | fake_shop | 65330 | 1/16/2019 |
MSI GeForce RTX 2070 | fake_shop | 65330 | 1/17/2019 |
MSI GeForce RTX 2070 | fake_shop | 65330 | 1/18/2019 |
Предположим, я хочу выбрать 2 лучших средних результата для категории и shop_name.Поэтому я ожидаю следующий результат:
category | shop_name | price | date | avg |
MSI GeForce RTX 2080 |amazon | 62649 | 1/6/2019 | 61431.4 |1
MSI GeForce RTX 2080 |amazon | 58668 | 1/17/2019 | 61431.4 |1
MSI GeForce RTX 2080 |amazon | 62649 | 1/7/2019 | 61431.4 |1
MSI GeForce RTX 2080 |amazon | 60542 | 1/16/2019 | 61431.4 |1
MSI GeForce RTX 2080 |amazon | 62649 | 1/5/2019 | 61431.4 |1
MSI GeForce RTX 2080 |brandstar | 66456 | 1/16/2019 | 66419.66667 | 3
MSI GeForce RTX 2080 |brandstar | 66347 | 1/17/2019 | 66419.66667 | 3
MSI GeForce RTX 2080 |brandstar | 66456 | 1/16/2019 | 66419.66667 | 3
MSI GeForce RTX 2080 |brigo | 63300 | 1/17/2019 | 64653.33333 | 2
MSI GeForce RTX 2080 |brigo | 65330 | 1/16/2019 | 64653.33333 | 2
MSI GeForce RTX 2080 |brigo | 65330 | 1/16/2019 | 64653.33333 | 2
MSI GeForce RTX 2070 | fake_shop | 65330 | 1/16/2019 | 65330 | 1
MSI GeForce RTX 2070 | fake_shop | 65330 | 1/17/2019 | 65330 | 1
MSI GeForce RTX 2070 | fake_shop | 65330 | 1/18/2019 | 65330 | 1
Тогда я бы хотел выбрать строки, где ранг меньше 3.
Но я получаю следующий результат:
---------------------------------------------------------------------------------------------
MSI GeForce RTX 2080 |amazon | 62649 | 1/6/2019 | 61431.4 | 1 |
MSI GeForce RTX 2080 |amazon | 58668 | 1/17/2019 | 61431.4 | 1 |
MSI GeForce RTX 2080 |amazon | 62649 | 1/7/2019 | 61431.4 | 1 |
MSI GeForce RTX 2080 |amazon | 60542 | 1/16/2019 | 61431.4 | 1 |
MSI GeForce RTX 2080 |amazon | 62649 | 1/5/2019 | 61431.4 | 1 |
MSI GeForce RTX 2080 |brandstar | 66456 | 1/16/2019 | 66419.66667 | 1 |
MSI GeForce RTX 2080 |brandstar | 66347 | 1/17/2019 | 66419.66667 | 1 |
MSI GeForce RTX 2080 |brandstar | 66456 | 1/16/2019 | 66419.66667 | 1 |
MSI GeForce RTX 2080 |brigo | 63300 | 1/17/2019 | 64653.33333 | 1 |
MSI GeForce RTX 2080 |brigo | 65330 | 1/16/2019 | 64653.33333 | 1 |
MSI GeForce RTX 2080 |brigo | 65330 | 1/16/2019 | 64653.33333 | 1 |
MSI GeForce RTX 2070 | fake_shop | 65330 | 1/16/2019 | 65330 | 1
MSI GeForce RTX 2070 | fake_shop | 65330 | 1/17/2019 | 65330 | 1
MSI GeForce RTX 2070 | fake_shop | 65330 | 1/18/2019 | 65330 | 1
Вот мой SQL-запрос:
SELECT tt.category,
tt.shop_name,
tt.price,
tt.updated,
tt.avg_price,
rank() OVER (PARTITION BY tt.category,
tt.shop_name,
tt.avg_price
ORDER BY tt.avg_price DESC)
FROM
( SELECT category,
LOWER(shop_name) AS shop_name,
CAST (price AS INTEGER) AS price,
DATE(updated) AS updated,
avg(price) OVER (PARTITION BY category,
LOWER(shop_name)) AS avg_price
FROM prices ) AS tt