WITH categories AS (
SELECT 'c1' category, 1 cat_order
UNION
SELECT 'c2', 2
UNION
SELECT 'c3', 3
)
SELECT id, title, description, "source", category, published_on
FROM (
SELECT *,
rank() OVER (PARTITION BY "source" ORDER BY cat_order, published_on DESC)
FROM news
JOIN categories USING(category)
) t
WHERE rank < 6
UNION
SELECT n.*
FROM news n
LEFT JOIN categories c USING(category)
WHERE c.category IS NULL
SELECT id, title, description, "source", category, published_on
FROM (
SELECT *,
rank() OVER (PARTITION BY "source" ORDER BY (CASE WHEN category = 'c1' THEN 1
WHEN category = 'c2' THEN 2
END)
, published_on DESC)
FROM news
WHERE category IN ('c1', 'c2')
) t
WHERE rank < 6
UNION
SELECT *
FROM news
WHERE category NOT IN ('c1', 'c2')
c1 + c2 из одного источника было не больше 5а Ваш запрос, в лучшем случае, выберет 5 записей из этих категорий для всех источников да ещё и со случайным порядком
А читал я в хлебных крошках - название раздела выходит неоднозначно Variable handling Functions
Самое интересное - если это конструкция - почему её нельзя выполнить без скобок, как например include?