Как это сделать?
Раннее название этого вопроса заключалось в "использовании ранга (@Rank: = @Rank + 1) в сложном запросе с подзапросами - будет ли он работать?" потому что я искал решение с использованием рангов, но теперь я вижу, что решение, отправленное Биллом, намного лучше.
Оригинальный вопрос:
Я пытаюсь составить запрос, который будет принимать последнюю запись из каждой группы с определенным порядком:
SET @Rank=0;
select s.*
from (select GroupId, max(Rank) AS MaxRank
from (select GroupId, @Rank := @Rank + 1 AS Rank
from Table
order by OrderField
) as t
group by GroupId) as t
join (
select *, @Rank := @Rank + 1 AS Rank
from Table
order by OrderField
) as s
on t.GroupId = s.GroupId and t.MaxRank = s.Rank
order by OrderField
Expression @Rank := @Rank + 1
обычно используется для ранжирования, но для меня он выглядит подозрительным при использовании в двух подзапросах, но инициализируется только один раз. Будет ли это работать таким образом?
И во-вторых, будет ли он работать с одним подзапросом, который оценивается несколько раз? Подобно подзапросу, в котором (или имеющем) предложение (другим способом, как написать выше):
SET @Rank=0;
select Table.*, @Rank := @Rank + 1 AS Rank
from Table
having Rank = (select max(Rank) AS MaxRank
from (select GroupId, @Rank := @Rank + 1 AS Rank
from Table as t0
order by OrderField
) as t
where t.GroupId = table.GroupId
)
order by OrderField
Спасибо заранее!