簡體   English   中英

SQL 查詢到 select 具有最小值的不同行

[英]SQL query to select distinct row with minimum value

我想要一個 SQL 語句來獲取具有最小值的行。

考慮這張表:

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

我如何 select 在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

這是做同樣事情的另一種方式,它可以讓你做一些有趣的事情,比如選擇前 5 名獲勝游戲等。

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

您現在可以正確獲取被識別為最低分數的實際行,並且您可以修改排序函數以使用多個條件,例如“顯示具有最低分數的最早游戲”等。

這將工作

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

由於僅使用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 DISTINCT 
FIRST_VALUE(ID) OVER (Partition by Game ORDER BY Point) AS ID,
Game,
FIRST_VALUE(Point) OVER (Partition by Game ORDER BY Point) AS Point
FROM #T
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子句。 這樣,它

  1. 創建不同的游戲列表,以及
  2. 獲取並輸出該游戲具有最低點數的記錄。

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

這是可移植的——至少在 ORACLE 和 PostgreSQL 之間:

select t.* from table t 
where not exists(select 1 from table ti where ti.attr > t.attr);

大多數答案使用內部查詢。 我想知道為什么不建議以下內容。

select
   *
from
   table
order by
   point
fetch next 1 row only   // ... or the appropriate syntax for the particular DB

使用JPAQueryFactory (一個 Java 查詢 DSL 類)編寫這個查詢非常簡單。

return new JPAQueryFactory(manager).
   selectFrom(QTable.table).
   setLockMode(LockModeType.OPTIMISTIC).
   orderBy(QTable.table.point.asc()).
   fetchFirst();

嘗試:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM