Как это сделать?
Прежний заголовок этого вопроса был « с использованием ранга (@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
Выражение @Rank: = @Rank + 1
обычно используется для ранга, но для меня это выглядит подозрительно, когда используется в 2 подзапросах, но инициализируется только один раз. Будет ли это работать таким образом?
И, во-вторых, будет ли он работать с одним подзапросом, который оценивается несколько раз? Как подзапрос в предложении where (или имеющий) (другой способ написания вышеупомянутого):
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
Заранее спасибо!