[英]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
子句。 這樣,它
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.