Ermak1
@Ermak1
Web-dev

Сделать выборку из базы mysql group by с первой и последней строкой?

Есть некая таблица periods с записями периодов для каждого субъекта и группы. Уникальной в ней является только полная связка subject_id - group_id - start(или finish).
Необходимо выбрать из таблицы субъекты у которых не закончился хотя бы один из периодов (т.е NOW() < finish), но также еще нужно сделать выборку самого первого периода и самого последнего (можно просто отдельными полями присоединенными к текущему периоду). Разумеется желательно сделать одним запросом. Есть вариант добавить столбцы в таблицу (например нумерацию периодов для каждого субъекта), но пока не вижу в этом решения.
5ea842e894d76601768911.png
  • Вопрос задан
  • 145 просмотров
Решения вопроса 1
@MaximaXXl
Я не очень понял "Есть вариант добавить столбцы в таблицу (например нумерацию периодов для каждого субъекта), но пока не вижу в этом решения."
Без этой фразы делать можно так:
select p.*
from periods p
join (
   select subject_id, group_id, min(start) min_start, max(start) max_start, max(case when "your date" between start and finish then start end) mid_start
   from periods 
   group by subject_id, group_id 
   having mid_start is not null  /*если хотите чтобы данные выводились только те у которых "your date" попал в период  */
) temp_T on ( p.subject_id = temp_T.subject_id 
          and p.group_id = temp_T.group_id 
          and p.start in (min_start, coalesce(mid_start,min_start), max_start))

если не хотите Having можно в on внести mid_start is not null

Не очень понял про интервалы, но если они не пересекаются то решение подойдет, если пересекаются ... надо переписать ;-)

UPD. Перечитал вопрос, если Вам надо NOW() < finish можете поменять условие в "your date" between start and finish. Но тогда не понятно про максимальный интервал, у Вас они на будущее написаны?

UPD2. Если MySQL 8, можно обойтись оконными функциями ;-) написть проще
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы