請問
在 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