Ответ 1
Использование:
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
Я хочу, чтобы оператор 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 5
3 x 2
Использование:
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
Это будет работать
select * from table
where (id,point) IN (select id,min(point) from table group by id);
Это еще один способ сделать то же самое, что позволит вам делать интересные вещи, например, выбирать лучшие 5 выигрышных игр и т.д.
SELECT *
FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Point) as RowNum, *
FROM Table
) X
WHERE RowNum = 1
Теперь вы можете правильно получить фактическую строку, которая была идентифицирована как самая низкая оценка, и вы можете изменить функцию заказа, чтобы использовать несколько критериев, таких как "Покажите мне самую раннюю игру с наименьшим счетом" и т.д.
Как только это отмечено только с помощью sql
, используется ANSI SQL и функция окна:
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;
ответ Кен Кларка не работал в моем случае. Возможно, это тоже не сработает. Если нет, попробуйте следующее:
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
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;
Этот альтернативный подход использует предложение SQL Server OUTER APPLY
. Таким образом, это
Предложение OUTER APPLY
можно представить как LEFT JOIN
, но с тем преимуществом, что вы можете использовать значения основного запроса в качестве параметров в подзапросе (здесь: игра).
SELECT colMinPointID
FROM (
SELECT game
FROM table
GROUP BY game
) As rstOuter
OUTER APPLY (
SELECT TOP 1 id As colMinPointID
FROM table As rstInner
WHERE rstInner.game = rstOuter.game
ORDER BY points
) AS rstMinPoints
Try:
select id, game, min(point) from t
group by id
попробовать:
SELECT id , game , MIN(point) FROM tablename GROUP BY game ;