2013-03-08 3 views
23

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

Рассмотрим эту таблицу:

id game point 
1 x  5 
1 z  4 
2 y  6 
3 x  2 
3 y  5 
3 z  8 

Как выбрать идентификаторы, которые имеют минимальное значение в столбце point, сгруппированные по игре? Как это:

id game point  
1 z  4 
2 y  6 
3 x  2 
+0

Вам нужно присоединиться к той же таблице, чтобы получить желаемый результат. Проверьте запрос ниже в ответе. –

+4

Почему игра «y» указывает значение 6 вместо 5 в ваших результатах? – billynoah

+1

Поскольку OP не ответил, я могу только предположить, что он хотел спросить «сгруппировано по id» и показать, какая игра имела тот самый низкий результат ... –

ответ

30

Использование:

Select tbl.* From TableName tbl 
Inner Join 
(
    Select Id,MIN(Point) MinPoint From TableName Group By Id 
)tbl1 
On tbl1.id=tbl.id 
Where tbl1.MinPoint=tbl.Point 
+0

Ровно ..! Спасибо – balaji

+0

Можно ли выполнить одно внутреннее соединение при записи в SQL в доступе Microsoft? – KSM

+4

noccessary complecation SELECT id, game, MIN (point) FROM tablename GROUP BY id, game –

-3

Try:

select id, game, min(point) from t 
group by id 
+1

Я получаю эту ошибку «Столбец« student.point »недействителен в предложении HAVING, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY. « – balaji

+0

Не могли бы вы попробовать. – www

+0

такой же ошибка. Я использую MS SQL – balaji

10

Это будет работать

select * from table 
where (id,point) IN (select id,min(point) from table group by id); 
+0

Какие rdbms вы используете? – Aspirant

+0

Я использую MS SQL – balaji

+1

Ohh !! я не знаю о MySQL ... Запрос - это проверка нескольких столбцов в подзапросе, который будет работать в Oracle. – Aspirant

0

Ken Clark's answer не работает в моем случае. Возможно, это тоже не сработает. Если нет, то попробуйте следующее:

SELECT * 
from table T 

INNER JOIN 
    (
    select id, MIN(point) MinPoint 
    from table T 
    group by AccountId 
) NewT on T.id = NewT.id and T.point = NewT.MinPoint 

ORDER BY game desc 
0
SELECT * from room 
INNER JOIN 
    (
    select DISTINCT hotelNo, MIN(price) MinPrice 
    from room 
Group by hotelNo 
) NewT 
on room.hotelNo = NewT.hotelNo and room.price = NewT.MinPrice; 
+2

Краткое объяснение того, как этот код отвечает на вопрос, значительно улучшит этот ответ – jmoreno

7

Как это помечается sql только, следующий использует ANSI SQL и window function:

select id, game, point 
from (
    select id, game, point, 
     row_number() over (partition by game order by point) as rn 
    from games 
) t 
where rn = 1; 
8

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

SELECT * 
FROM 
(
    SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Point) as RowNum, * 
    FROM Table 
) X 
WHERE RowNum = 1 

Теперь вы можете правильно получить фактическую строку, которая была идентифицирована как самая низкая оценка, и вы можете изменить функцию заказа, чтобы использовать несколько критериев, таких как «Покажите мне самую раннюю игру с наименьшим счетом» и т. Д.

+0

приятный и короткий. используя функции окна. – absurd

Смежные вопросы