web-dev-qa-db-ja.com

最小値を持つ個別の行を選択する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を選択するにはどうすればよいですか?次のように:

id  game   point    
1    z      4
2    y      5
3    x      2   
42
balaji

つかいます:

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
47
Ken Clark

これは動作します

select * from table 
where (id,point) IN (select id,min(point) from table group by id);
15
Aspirant

これは同じことを行う別の方法です。これにより、トップ5の勝利ゲームを選択するなどの興味深いことを行うことができます。

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

スコアが最も低い行として識別された実際の行を正しく取得できるようになり、「最小スコアの最も古いゲームを表示する」など、複数の基準を使用するように順序付け関数を変更できます。

12
Shiroy

これは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;
12

ケンクラークの答え 私の場合はうまくいきませんでした。どちらでも動作しない可能性があります。そうでない場合は、これを試してください:

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
samthebrand
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;
0
Tshultrim Dorji

この代替アプローチでは、SQL ServerのOUTER APPLY句を使用します。このように、それ

  1. ゲームの個別のリストを作成し、
  2. そのゲームの最低ポイント数のレコードを取得して出力します。

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
0
The Conspiracy