SQL - выберите «n» лучших элементов в группе - PullRequest
1 голос
/ 24 сентября 2011

Агрегатная функция SQL MAX позволит вам выбрать верхний элемент в группе.Есть ли способ выбрать верхние n элементы для каждой группы?

Например, если бы у меня была таблица пользователей, которая занимала их ранг деления, и хотела, чтобы два верхних пользователя приходились на деление ...

Users
userId | division | rank
1      | 1        | 1
2      | 1        | 2
3      | 1        | 3
4      | 2        | 3

Я бы хотел, чтобы запрос как-то возвращал пользователей 2,3,4

Если это имеет значение, я использую MySQL.

Ответы [ 4 ]

1 голос
/ 24 сентября 2011
select * from users as t1
where (select count(*) from users as t2
       where t1.division = t2.division and t2.rank > t1.rank) <2
order by division,rank
0 голосов
/ 24 сентября 2011
SELECT * from users u0
WHERE NOT EXISIS (
  SELECT * FROM users u1
  WHERE u1.division = u0.division
  AND u1.rank >= u0.rank +2
  );

Кстати: большинство людей считает ранги, начиная с нуля: позиция опроса получает ранг = 1, вторая получает ранг = 2 и так далее.В этом случае ваш ранг равен 1+. Количество людей до вас в рейтинге

0 голосов
/ 24 сентября 2011

Попробуйте это:

  SELECT *
    FROM (
         SELECT *, row_number() OVER (PARTITION BY division ORDER BY rank DESC) as rn
           FROM users
         ) as extended_users
   WHERE rn <= 2
ORDER BY userId
0 голосов
/ 24 сентября 2011
   SELECT * FROM (
      SELECT u1.userid, u1.rank 
      FROM users u1
      GROUP BY u1.division
      HAVING u1.rank = MAX(u1.rank)
      ORDER BY u1.rank DESC
    UNION
      SELECT u2.userid, u2.rank 
      FROM users u2
      WHERE u2.id <> u1.id
      GROUP BY u2.division
      HAVING u2.rank = MAX(u2.rank)
      ORDER BY u2.rank DESC
    ) ranking
    ORDER BY ranking.userid 
...