數據分析中經常使用的SQL語句

分組選擇數據

問題1:如何得到每一個分組前n項結果?

場景:假設有一個表,記錄了學生全部科目的成績,那麼如今要取出每一個科目分數最高的2位同窗的考試成績。
表名爲student_grade
表中字段爲:
course_id,course_name, student_id, student_name, grademysql

方法一:利用row_number()函數

select course_id,course_name, student_id, student_name, grade,
    row_number() over(partition by course_id order by grade desc) as rank
from student_grade
where rank <= 2

注:MySQL中不支持使用row_number()函數sql

方法二:利用嵌套函數

select * from (
select course_id, course_name, student_id, student_name, grade,
    (select count(*) from student_grade as t2
        where t1.course_id=t2.course_id and t1.grade<=t2.grade) 
        as rank
from student_grade as t1) as t3
where rank <=2
order by course_id, rank

在嵌套查詢中,利用兩個表的course_id字段相等,能夠獲得這個分組下每條記錄在分組中的排名(rank)函數

問題2:如何得到每一個分組前n項的和?

相應的要獲取分組中,前n項的和或者平均值之類的,只須要以查詢的結果爲一個新的表,在該表上查詢相應的聚合值。優化

select sum(grade) from (
select course_id, course_name, student_id, student_name, grade,
    (select count(*) from student_grade as t2
        where t1.course_id=t2.course_id and t1.grade<=t2.grade) 
        as rank
from student_grade as t1) as t3
where rank <=2
group by course_id

問題3: 如何得到分組內每一項在分組和中所佔的百分比?

select *, grade/course_grade_sum as percent from(
select course_id, course_name, student_id, student_name, grade,
         (select sum(grade) from student_grade as t2
            where t1.course_id=t2.course_id) as course_grade_sum
from student_grade as t1) as b

Join語句

問題1:如何使用join語句優化子查詢?

查詢每一個人考試分數最高的科目的記錄code

方法一:使用子查詢的方式

select *
from student_grade as t1
where grade = (select max(grade) from student_grade as t2
where t1.student_id=t2.student_id)

方法二:使用join語句

select t1.student_id, t1.student_name, t1.course_id, t1.course_name, t1.grade
from student_grade as t1
left join student_grade as t2
on t1.student_id= t2.student_id
group by t1.student_id,t1.student_name, t1.course_id, t1.course_name, t1.grade
having t1.grade=max(t2.grade)

最後的having條件中max(t2.grade)基於的範圍是什麼?是join的條件麼?排序

參考資料:慕課網MySQL開發技巧(一)開發

隨機獲取N條記錄

mysql中,能夠利用rand()函數排序,而後取前n條結果get

select *
from table1
order by rand()
limit n
相關文章
相關標籤/搜索