PostgreSQL. Каз задать LIMIT и OFFSET только для одной таблице при JOIN

Есть две таблицы, student и test. Делаем выборку студентов с их результатами тестов. Вот пример http://sqlfiddle.com/#!15/ad0928/2

Как задать LIMIT и OFFSET для первой таблицы student так, чтобы сохранилась возможность сортировки результата как по student так и по test?

Т.е. мне нужно, чтобы количество студентов было, например, 25 штук. Но при этом:

  • в выборке видеть так же и тесты которые они проходили (у каждого студента может быть несколько пройденных тестов);
  • и иметь возможность отсортировать выборку по набранным баллам за тест.

Исходные таблицы например выглядят так: исходные таблицы

И мне нужно получить 4 студентов со всеми их тестами, где студенты с тестом по subject_id = 2 были бы отсортированы по убыванию результата теста.

И вот примерный результат, который хотелось бы получить: примерный результат


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

Автор решения: Олег

Запрос

WITH cte AS (
  SELECT
    a.id,
    a.name,
    b.subject_id,
    b.user_id,
    b.score,
    DENSE_RANK () OVER (
      ORDER BY a.id
    ) dr -- делаем подсчет по student.id
  FROM
    student as a
    LEFT JOIN test b ON (a.user_id = b.user_id and b.subject_id in (1, 2, 3, 4))
  ORDER BY
    case when b.subject_id = 2 then b.score else 0 end DESC, a.id ASC
)
SELECT *
FROM cte
WHERE dr <= 4 -- выбираем только 4 первых студентов

http://sqlfiddle.com/#!15/e2123/13

Результирующая таблица введите сюда описание изображения

→ Ссылка