iT邦幫忙

0

在 group by 時,只想取得同一群組內特定條件的某一Row的資料

  • 分享至 

  • xImage

請問
在 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,怎樣的作法最簡單?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

8
wonton
iT邦高手 6 級 ‧ 2014-07-27 18:02:05
最佳解答

以下只有使用 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`)

結果如下圖:

看更多先前的回應...收起先前的回應...
builder iT邦新手 1 級 ‧ 2014-07-27 20:02:55 檢舉

您好
原來 where 子句可以這樣用唷? 我以前都不知道耶...請問哪裡可以找到相關資料
WHERE (vc\_name, i\_score)

Albert iT邦高手 1 級 ‧ 2014-07-27 22:40:03 檢舉

你的建議很好
給你一個讚
在給你一個千萬筆資料的建議
不要用 IN
一定要用 EXISTS
大系統整合需要經驗, 請注意細節

Albert iT邦高手 1 級 ‧ 2014-07-27 22:40:28 檢舉

albertachen提到:
在給你一個千萬筆資料的建議

再給你一個千萬筆資料的建議

wonton iT邦高手 6 級 ‧ 2014-07-28 08:58:36 檢舉

啊,對,好像有看過 EXISTS 和 IN 的比較,謝謝albert大的提醒。

0
fox18
iT邦研究生 5 級 ‧ 2014-07-28 11:53:18

用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

我要發表回答

立即登入回答