Оптимальный запрос

Есть конкретный вопрос. Имеется таблица новостей posts, есть поле area_id
area_id может быть например от 1 до 50
Задача: Если есть возможность одним запросом, если нет, наиболее оптимальным способом выбрать из базы по 10 записей для каждой area_id


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

Автор решения: Akina
WITH cte AS ( SELECT *, 
              ROW_NUMBER() OVER (PARTITION BY area_id ORDER BY id) AS rn
              FROM posts )
SELECT *
FROM cte
WHERE rn <= 10

Ну или ORDER BY RAND().


А если расширить вопрос и нужно выбрать разное количество записей, например area_id = 1 10 штук, area_id = 2 30 штук – sepgg

WITH cte AS ( SELECT *, 
              ROW_NUMBER() OVER (PARTITION BY area_id ORDER BY id) AS rn
              FROM posts ), 
     cnt AS ( SELECT 1 area_id, 10 amount UNION ALL
              SELECT 2, 30 UNION ALL
              ... )
SELECT *
FROM cte
JOIN cnt USING (area_id)
WHERE cte.rn <= cnt.amount
→ Ссылка