Re: [請益] 分別找出學生成績為幾天新高

作者: wilson200106 (種子種子)   2015-12-09 18:57:37
select grade as '分數', nameid as '學生編號',DATEDIFF(kdate,a) as '幾日內最高'
FROM
(select t.grade,t.nameid,t.kdate
(select kdate from 資料表 where gradelist >= t.grade and nameid = t.nameid
and kdate < t.kdate order by kdate desc limit 1) as a
from gradelist t where kdate = '輸入日期' group by t.nameid) A
試試看這樣子呢? 要先把當日學生成績輸入
之後就可以依照輸入日期來看每位學生的成績
以及相隔幾天內的最高分
當然如果是史無前例的最高分或是最低分可能就要把DATEDIFF那邊再做更正(用case)
但是三層還是很耗就是了XD
※ 引述《jami520 (我的生命因你而發光)》之銘言:
: 目前有個成績表會記錄300個學生每天的成績
: 目前我想做像下方這樣呈現
: 學生姓名 成績為幾天新高分
: 學生A 5
: 學生B 32
: 學生C 18
: 學生D 3
: ............................
: 請問大家這樣會如何做到上述的結果呢?
: 初步我是想說用迴圈跑三百個學生
: 而每個學生又再從最近的日期開始往前推去跑迴圈判讀如下
: do{
: $sql="SELECT nameid FROM (SELECT grade, nameid FROM gradelist
: where nameid=迴圈學生id and kdate=今天) a1
: LEFT JOIN (SELECT MAX(grade) as MaxGrade, nameid FROM gradelist
: where nameid=迴圈學生id and kdate<=今天 and kdate>=每天日期
: group by nameid) a2 ON a1.nameid=a2.nameid
: where a1.grade=ab2.MaxGrade";
: }while(所有學生的迴圈);
: 當選出來為0筆的時候就終止迴圈,代表已經找到某學生成績為幾天的新高
: 然後再跑下一位學生的數據
: 感覺是不太聰明的做法,因為假設日期有300天好了
: 這樣迴圈就要跑300學生*300天=9000個
: 不曉得是否有其他的做法可以做得到呢?
作者: jami520 (我的生命因你而發光)   2015-12-11 14:01:00
感謝大大回覆,這樣三層雖然很耗資源,但或許可以跟之前作法做比較一下,只是多了一個方法可以參考,謝謝

Links booklink

Contact Us: admin [ a t ] ucptt.com