@f00kat

Как можно улучшить запрос?

Есть две таблицы
CREATE TABLE peak_sessions (
          id        		  INTEGER PRIMARY KEY,
          user_id         INTEGER NOT NULL, 
          begin_timestamp INTEGER NOT NULL,
          end_timestamp   INTEGER,
          weight_units    INTEGER DEFAULT 0,
          description     TEXT DEFAULT "",
          FOREIGN KEY (user_id)
               REFERENCES users (id) 
        );

CREATE TABLE peak_sessions_sets (
          id        		  INTEGER PRIMARY KEY,
          session_id      INTEGER NOT NULL,
          number      INTEGER NOT NULL,
          begin_timestamp INTEGER NOT NULL,
          end_timestamp   INTEGER NOT NULL,
          peak            INTEGER NOT NULL,
          description     TEXT DEFAULT "",
          measures        BLOB NOT NULL,
          FOREIGN KEY (session_id)
               REFERENCES peak_sessions (id) 
        );


Есть peak_sessions принадлежащие конкретному user_id. Так же есть peak_sessions_sets, ссылающаяся на peak_sessions и хранящяя максимумы(peak).

Я хочу составить запрос "Среди всех peak_sessions принадлежащих пользователю peak_sessions.user_id = 1 выбрать по одной peak_sessions_sets, содержащей максимальное значение peak_sessions_sets.peak"
У меня получилось так
SELECT pss.*
FROM peak_sessions_sets pss
JOIN (
    SELECT session_id, MAX(peak) AS max_peak
    FROM peak_sessions_sets
    JOIN peak_sessions ON peak_sessions_sets.session_id = peak_sessions.id
    WHERE peak_sessions.user_id = 1
    GROUP BY session_id
) max_peaks ON pss.session_id = max_peaks.session_id
AND pss.peak = max_peaks.max_peak;
  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
@alexalexes
select A.*
from (SELECT Pss.session_id,  Pss.peak,
         row_number() over (partition by Ps.id order by Pss.peak desc) rnm -- нумеруем оконной функцией выборку в пределах каждого Ps.id по нужной сортировке
    FROM peak_sessions_sets Pss
    JOIN peak_sessions Ps ON Pss.session_id = Ps.id
    WHERE Ps.user_id = 1
) A
where A.rnm = 1 -- извлекаем по 1 записи
order by A.Peak Desc -- если надо, то еще как-то сортируем итог
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы