北京天海網(wǎng)站建設(shè)公司黃頁(yè)網(wǎng)站推廣app咋做廣告
今日我在刷題時(shí)遇到這樣一個(gè)題,它提到了以下需求:
有一場(chǎng)節(jié)目表演,五名裁判會(huì)對(duì)節(jié)目提供1-10分的打分,節(jié)目最終得分為去掉一個(gè)最高分和一個(gè)最低分后的平均分。
存在以下一張表performence_detail,包含字段有performance_id,一號(hào)評(píng)委打分score_1,二號(hào)評(píng)委打分score_2,三號(hào)評(píng)委打分score_3,四號(hào)評(píng)委打分score_4,五號(hào)評(píng)委打分score_5,評(píng)分時(shí)間date。
我實(shí)現(xiàn)表如下
但是遇到一個(gè)問(wèn)題,要想實(shí)現(xiàn)以上需求,就需要找到一行中的最大值和最小值,我們平時(shí)使用的聚合函數(shù)MAX()、MIN()只能針對(duì)分組后的列進(jìn)行計(jì)算,也就是我們通常說(shuō)的橫表,而針對(duì)同一行的相同數(shù)據(jù)類型我們需要另尋出路。
我查找了網(wǎng)上相關(guān)資料找到了如下解決方案
SQL內(nèi)置函數(shù)
GREATEST(value1,value2,...)
select performance_id,greatest(score_1,score_2,score_3,score_4,score_5) as great_score
from performance_detail
?LEAST(value1,value2,...)
select performance_id,least(score_1,score_2,score_3,score_4,score_5) as least_score
from performance_detail
這兩個(gè)函數(shù)滿足以下規(guī)則
如果有任何參數(shù)
NULL
,則結(jié)果為NULL
。無(wú)需比較。如果所有參數(shù)都是整數(shù)值,則將它們作為整數(shù)進(jìn)行比較。
如果至少一個(gè)參數(shù)為雙精度,則將它們作為雙精度值進(jìn)行比較。否則,如果至少一個(gè)參數(shù)是一個(gè)?DECIMAL值,則將它們作為DECIMAL?值進(jìn)行比較。
如果參數(shù)包含數(shù)字和字符串的混合,則將它們作為數(shù)字進(jìn)行比較。
如果任何參數(shù)是非二進(jìn)制(字符)字符串,則將參數(shù)作為非二進(jìn)制字符串進(jìn)行比較。
在所有其他情況下,將參數(shù)作為二進(jìn)制字符串進(jìn)行比較。
表行轉(zhuǎn)換為列
除以以外我們還可以把橫表轉(zhuǎn)換為豎標(biāo),再使用聚合函數(shù)進(jìn)行篩選最大值和最小值
由于MySQL不支持unpiovt轉(zhuǎn)換函數(shù),可以使用union 替代
select performance_id, 'score_1' scores, score_1 as score from performance_detail
union select performance_id, 'score_2' scores, score_2 as score from performance_detail
union select performance_id, 'score_3' scores, score_3 as score from performance_detail
union select performance_id, 'score_4' scores, score_4 as score from performance_detail
union select performance_id, 'score_5' scores, score_5 as score from performance_detail
order by performance_id
接下來(lái)就可以使用MAX()、MIN()函數(shù)分組找到最大值和最小值了。