В MySQL 8+ вы можете использовать row_number()
, чтобы назначить номер каждой строке, разделенной на id
. Как только число соответствует порядку по sequence
по возрастанию - первая строка для идентификатора получает 1
-, а при уменьшении последней строки по идентификатору получается 1
. Поместите это в две производные таблицы, которые вы затем объедините на общих id
и row_number()
. В предложении WHERE
фильтр для row_number()
равен 1
. (Если sequence
гарантированно начинается с 1
, вы также можете использовать sequence
напрямую вместо row_number()
в порядке возрастания sequence
, так как оба значения 1
для первой строки.)
Чтобы получить счет, вы можете использовать оконную версию count()
, разделенную на id
.
datediff()
, чтобы получить день между первой и последней строкой id
.
SELECT x1.id,
x1.initial_date,
x2.updated_date final_date,
datediff(x2.updated_date, x1.initial_date) day_diff,
x1.c count,
x1.value_1,
x2.value_1 f_value_1,
x1.value_2,
x2.value_2 f_value_2,
x1.value_3,
x2.value_3 f_value_3,
x1.value_4,
x2.value_4 f_value_4
FROM (SELECT id,
initial_date,
count(*) OVER (PARTITION BY id) c,
value_1,
value_2,
value_3,
value_4,
row_number() OVER (PARTITION BY id
ORDER BY sequence ASC) rn
FROM table1) x1
INNER JOIN (SELECT id,
updated_date,
value_1,
value_2,
value_3,
value_4,
row_number() OVER (PARTITION BY id
ORDER BY sequence DESC) rn
FROM table1) x2
ON x2.id = x1.id
AND x2.rn = x1.rn
WHERE x1.rn = 1;