2015-10-19 45 views
-1

發佈我有了如下表有問題所有的電影:查找同一工作室

Movie    Studio Year Rating 
The Shining  Warner 1999  8.4 
The Pianist  Warner 2002  8.6 
The LOTR  Dreamworks 2004  8.7 
License to Kill Dreamworks 2001  8.3 
Complicated   HP  2005  7.7 
Django Unchained HP  2003  8.8 
Diamonds  John Lewis 1997  6.7 

你如何找到有較高的評價比以前發佈的所有 電影由同一個電影工作室的所有電影?

所以輸出,我猜應該是:鋼琴家,因爲它發佈晚於其他電影的閃耀,由同一個工作室,並有更高的評級。 LOTR出於與上述相同的原因。

Django Unchained,因爲雖然Complicated後來發佈它的評級比Complcated低。它也恰好是該工作室最古老的電影,所以我不知道如何處理這個問題。

最後,鑽石應該歸還,因爲它是該工作室的唯一電影,沒有什麼可比較的。

+0

如果你想返回每個工作室正是一部電影,你必須決定什麼是最重要的 - 最高評分或最近的電影。 – jarlh

回答

2
select * from movietable t1 
where not exists (select 1 from movietable t2 
        where t2.studio = t1.studio 
        and t2.rating > t1.rating 
        and t2.year < t1.year) 

會返回一個電影如果同一工作室有沒有舊的電影了較高的評價。這是你要求的嗎?

+0

你確定t2.year t1s年 – Thomas

+0

@Thomas,我的選擇正如我所描述的那樣工作,即如果同一個工作室沒有更高評級的老電影,則返回電影。 – jarlh

+0

啊,我反過來想過它。 TNX! – Thomas

0

該解決方案將與支持窗口功能的RDBMS協同工作。

WITH cte AS 
(
    SELECT *, rn = RANK() OVER (PARTITION BY Studio ORDER BY Rating DESC) 
    FROM #mytable 
) 
SELECT * 
FROM cte 
WHERE rn = 1 

LiveDemo

0

對於原來的語句:

select * from movietable where not exists (select 1 from movietable t2 where 
movietable.studio = t2.studio and movietable.year < t2.year) 

對於Django的第二條語句應該被提出來:

select * from movietable where not exists (select 1 from movietable t2 where 
movietable.studio = t2.studio and movietable.year < t2.year 
and movietable.rating <= t2.rating 
)