SQLステートメントに最小値の行を取得させたい。
次の表を検討してください。
id game point
1 x 5
1 z 4
2 y 6
3 x 2
3 y 5
3 z 8
point
列に最小値があり、ゲームごとにグループ化されたIDを選択するにはどうすればよいですか?次のように:
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と 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;
ケンクラークの答え 私の場合はうまくいきませんでした。どちらでも動作しない可能性があります。そうでない場合は、これを試してください:
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
として想像できますが、次のことができるという利点がありますサブクエリのパラメータとしてメインクエリの値を使用(ここではgame)。
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