請問
在 group by 時,只想取得同一群組內特定條件的某一Row的資料
舉例來說有一table紀錄學生的成績資料,如下
CREATE TABLE IF NOT EXISTS my\_tbl (
i\_sID int(10) unsigned NOT NULL auto_increment,
vc\_name varchar(50) NOT NULL,
vc\_subject varchar(50) NOT NULL,
i\_score int(11) NOT NULL,
PRIMARY KEY (i\_sID)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='測試用table';
INSERT INTO my\_tbl (i\_sID, vc\_name, vc\_subject, i\_score) VALUES
(1, '小明', '國文', 55),
(2, '小華', '英文', 60),
(3, '小明', '英文', 90),
(4, '小華', '國文', 50),
(5, '小明', '數學', 70),
(6, '小華', '數學', 70);
想求得每位學生最高成績的那個 Row,怎樣的作法最簡單?
以下只有使用 mysql 測試過...
<pre class="c" name="code">SELECT * FROM `my_tbl`
   WHERE (`vc_name`, `i_score`) IN
      (SELECT `vc_name`, max(`i_score`) FROM `my_tbl` group by `vc_name`)
結果如下圖:

用MSSQL的路過
想法是利用排序函數 然後對名字做分組,分數做排序
分數最高的就是num=1
題外話 小明有兩筆不同科目剛好同分又是最高分的話
以這個方式他們的num都會=1 所以兩筆都會列出來
mysql應該有類似的方式吧 你再試看看吧
select dt.i_sID,dt.vc_name,dt.vc_subject,dt.i_score,dt.num
from
(
select m.i_sID , m.vc_name , m.vc_subject , m.i_score
,DENSE_RANK() OVER(partition by m.vc_name order by m.i_score desc) as num
from dbo.my_tbl m
) dt
where dt.num = 1
你想要從每位學生的多個科目中取得他們最高成績的那一筆資料,可以利用 GROUP BY 搭配 MAX() 函數來取得每位學生的最高成績,然後再用 JOIN 來查找對應的學生和科目的資料。
Sprunki Retake