2014-03-31 49 views
-1
set search_path = 'project'; 

select g.firstname,g.lastname, g.rating, sh.showname 
from guest g, shows sh, timeslot ts 
where sh.shownumber = ts.shownumber 
and ts.guestnumber = g.guestnumber 
order by sh.showname 

這是結果Max和鮮明的SQL查詢

"Charlie ";"Sheen";7.2;"Cooking Show" 
"Charlie";"Sheen";7.2;"Cooking Show" 
"Carl";"Makky";7.0;"Cooking Show" 
"Barack";"Obama";6.7;"Fitness Mania" 
"Vladimir";"Putin";8.2;"Fitness Mania" 
"kim";"jung";5.3;"Fitness Mania" 
"kim";"jung";5.3;"Gamers Heaven" 
"Justin";"Trudeau";8.5;"Kids Play Time" 
"Charlie";"Sheen";7.2;"Kids Play Time" 
"ellen";"page";9.2;"Weather News" 

我要的是收視率最高的客人每場,所以它應該有5條記錄,其中最高等級的每個可用顯示一個記錄客人

回答

1

如果你需要每場只有一個客人 - 您可以使用DISTINCT ON

select distinct on (sh.showname) g.firstname, g.lastname, g.rating, sh.showname 
from guest g, shows sh, timeslot ts 
where sh.shownumber = ts.shownumber 
and ts.guestnumber = g.guestnumber 
order by sh.showname, g.rating desc 
3

這是row_number()功能良好的應用:

select firstname, lastname, rating, showname 
from (select g.firstname, g.lastname, g.rating, sh.showname, 
      row_number() over (partition by sh.showname order by g.rating desc) as seqnum 
     from guest g shows sh join 
      timeslot ts 
      on sh.shownumber = ts.shownumber join 
      guest g 
      on ts.guestnumber = g.guestnumber 
    ) gr 
where seqnum = 1 
order by showname; 

我還修改代碼使用明確的join語法。

如果您想要每場演出五位嘉賓,請使用seqnum <= 5

+0

我想每場一個收視率最高的客人,這意味着5條在每場一個客人,它的5條記錄,因爲我有5的數據庫顯示 – user3241846

+0

@ user3241846。 。 。好的,這就是查詢用'seqnum = 1'所做的。 –

+0

我喜歡這個。我發現這個任務 - 想要一些標準的最佳整行 - 在SQL中是一個尷尬的角落案例,我以前使用像'SELECT ... FROM tbl t1 WHERE ... AND NOT EXISTS(SELECT 1 FROM tbl t2 WHERE t2.X = t1.X and t2.criterion