Получить записи с наивысшим / наименьшим <что угодно> на группу

Как это сделать?

Прежний заголовок этого вопроса был « с использованием ранга (@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

Заранее спасибо!

84
задан TMS 7 January 2012 в 11:37
поделиться