2013-03-08 35 views
23

我想要一條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  6 
3 x  2 
+0

你需要加入同一張表才能得到想要的結果。在答案中檢查下面的查詢。 – 2013-03-08 10:51:32

+4

爲什麼遊戲「y」在結果中指向的值是6而不是5? – billynoah 2014-08-20 19:40:59

+1

由於OP沒有迴應,我只能假設他打算問「按ID分組」,並顯示哪個遊戲有最低分數... – 2015-04-08 16:20:07

回答

30

用途:

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 
+0

正是..!謝謝 – balaji 2013-03-08 10:56:40

+0

在Microsoft Access中的SQL中寫入時可以完成單個內部聯接嗎? – KSM 2014-04-11 16:53:37

+4

無用complecation SELECT ID,遊戲,MIN(點)FROM表名GROUP BY ID,遊戲 – 2014-05-09 16:12:55

-3

嘗試:

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

我收到此錯誤「Column'student.point'無效在HAVING子句中,因爲它不包含在集合函數或GROUP BY子句中。 「 – balaji 2013-03-08 10:35:13

+0

你現在可以嘗試嗎? – www 2013-03-08 10:39:33

+0

同樣的錯誤。我正在使用MS SQL – balaji 2013-03-08 10:49:25

10

這將工作

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

您使用哪種rdbms? – Aspirant 2013-03-08 10:41:32

+0

我正在使用MS SQL – balaji 2013-03-08 10:47:34

+1

哦!我不知道MySQL ...查詢是多列檢查子查詢它將在Oracle中工作。 – Aspirant 2013-03-08 11:17:09

0

Ken Clark's answer並沒有我的情況下工作。它可能無法在你的工作。如果沒有,試試這個:

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
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; 
+2

簡短的解釋如何這個代碼回答這個問題將大大改善這個答案 – jmoreno 2015-09-27 04:12:38

7

由於這是標有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; 
8

這是做同樣的事情的另一種方式,這將允許你做有趣的事情,如選擇前5名的獲勝遊戲等。

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

您現在可以正確地獲得被確定爲具有最低分數的實際行,並且您可以修改排序功能以使用多個條件,例如「顯示具有最小分數的最早遊戲」等。

+0

好和短。利用窗口函數。 – absurd 2016-05-17 10:34:35

相關問題