Извлечь одну строку для идентификатора аккаунта из списка - PullRequest
6 голосов
/ 18 сентября 2008

У меня есть таблица с игровыми счетами, позволяющая иметь несколько строк для идентификатора аккаунта: scores (id, score, accountid). Я хочу получить список 10 лучших идентификаторов и их результатов.

Можете ли вы предоставить SQL-отчет для выбора 10 лучших результатов, но только один счет для идентификатора учетной записи?

Спасибо!

Ответы [ 6 ]

4 голосов
/ 18 сентября 2008
select username, max(score) from usertable group by username order by max(score) desc limit 10;
2 голосов
/ 18 сентября 2008

Сначала ограничьте выбор наибольшим количеством баллов для каждого идентификатора аккаунта. Затем возьмите десятку лучших.

SELECT TOP 10 AccountId, Score
FROM Scores s1
WHERE AccountId NOT IN 
    (SELECT AccountId s2 FROM Scores 
     WHERE s1.AccountId = s2.AccountId and s1.Score > s2.Score)
ORDER BY Score DESC
2 голосов
/ 18 сентября 2008

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

select top 10 username, 
              max(score) 
from usertable 
group by username 
order by max(score) desc
1 голос
/ 21 сентября 2008
SELECT accountid, MAX(score) as top_score
FROM Scores
GROUP BY accountid,
ORDER BY top_score DESC
LIMIT 0, 10

Это должно хорошо работать в MySQL. Возможно, вам может понадобиться использовать «ORDER BY MAX (оценка) DESC» вместо этого порядка - у меня нет под рукой ссылки на SQL.

1 голос
/ 18 сентября 2008

PostgreSQL имеет предложение DISTINCT ON, которое работает следующим образом:

SELECT DISTINCT ON (accountid) id, score, accountid
FROM scoretable
ORDER BY score DESC
LIMIT 10;

Я не думаю, что это стандартный SQL, поэтому ожидайте, что другие базы данных сделают это по-другому.

0 голосов
/ 23 июля 2009

Я считаю, что PostgreSQL (как минимум 8.3) потребует, чтобы выражения DISTINCT ON соответствовали исходным ORDER BY выражениям. И.Е. Вы не можете использовать DISTINCT ON (accountid), когда у вас есть ORDER BY score DESC. Чтобы это исправить, добавьте его в ORDER BY:

SELECT DISTINCT ON (accountid) *
FROM scoretable
ORDER BY accountid, score DESC
LIMIT 10;

Использование этого метода позволяет выбрать все столбцы в таблице. Он будет возвращать только 1 строку на учетную запись, даже если для оценки есть повторяющиеся значения 'max'.

Это было полезно для меня, так как я не нашел максимальный балл (что легко сделать с помощью функции max ()), но в последнее время для балла был введен балл для аккаунта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...