逛貼吧看到有個面試sql的題目,他答案根本風牛馬不相及,想起來最近看到的那個分組排序取前幾的。
1.貼吧里面試題的sql
要求結果是:
sql:
--結果是day,success,fail數量 select day_id as day, (select count(1) from r_test b where a.day_id = b.day_id and b.result = 'success') as success, (select count(1) from r_test c where a.day_id = c.day_id and c.result = 'fail') as fail from r_test a group by day_id order by day_id asc
2.分組排序取前幾的,例如先建個表:按group分組,取分數前3的。oracle有分組排序取前幾的函數。
a.不用函數寫,不重復名次時候沒問題(但是名次重復了有問題)。
主要想法是多一個字段給排序用
b.用oracle分組排序函數寫。ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
也是給它多一個字段
分組排序這個問題
改一下數:B分組里取前兩名,並列的兩名都要查詢到。
表數據:
上面那兩條sql會造成:
第一條,用a.score > = b.score 這個條件,如果並列第二名,會出現nm這個字段查出來為1,3,3沒有2. 所以這么寫還是錯的。第一條查不出第二名因為nm為1,3,3 ;
第二條只能查出一個並列的另一個查不出來。
第二條結果:
剛剛想了想,最終解決辦法:
針對我的這種要求(且取前兩名,並列的兩名都要查詢到。),不使用函數而使用第一種做法,改一下后面那個nm<=2的條件
有更好的辦法再補充。