Сортировка в SQL по новизне и по рейтингу

База данных Postgres 17. Есть таблица:

id title rating created_at
1 Name1 10 2025-02-01
2 Name2 30 2025-02-02
3 Name3 20 2025-02-03
4 Name4 0 2025-02-20

Как составить SQL запрос чтобы ORDER BY был в зависимости от даты создания. Если разница даты от текущей меньше 10 дней, то чтобы сортировалось по дате, иначе сортировалось бы по рейтингу. Что-то типа такого:

CASE WHEN created_at >= '2025-02-14' THEN created_at ELSE rating END DESC

Результат должен быть:

  1. Name4
  2. Name2
  3. Name3
  4. Name1

Ну или как это можно сделать средствами Laravel


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

Автор решения: Akina

Если разница даты от текущей меньше 10 дней, то чтобы сортировалось по дате, иначе сортировалось бы по рейтингу.

ORDER BY 
  -- первый шаг - сперва отделяем новые от старых
    CASE WHEN created_at >= '2025-02-14' THEN 0 ELSE 1 END ASC, 
  -- второй шаг - сортируем новые по дате, сперва самые новые
    CASE WHEN created_at >= '2025-02-14' THEN created_at END DESC, 
  -- третий шаг - сортируем по рейтингу, сначала наибольший рейтинг
    rating DESC

Ну и чисто поржать:

ORDER BY CASE WHEN created_at >= '2025-02-14' 
         THEN created_at - '2025-02-28' + 100 
         ELSE rating 
         END

Где '2025-02-28' - дата заведомо не меньше любой даты в таблице, а 100 - число заведомо больше, чем интервал между выбранной выше датой и самой древней датой в таблице в днях. Ну и предполагается, что рейтинг не может быть отрицательным.

→ Ссылка
Автор решения: Alex
SELECT * FROM your_table
ORDER BY 
    CASE 
        WHEN CURRENT_DATE - created_at < INTERVAL '10 days' THEN created_at
        ELSE rating
    END DESC;
→ Ссылка