2017-02-03 1 views
0

У меня есть таблица, как показано ниже:Запрос на макс для каждого года/актер

Create Table Movies (
    ID int, 
    Actor varchar (50), 
    MovieName varchar (50), 
    ReleaseDate Date 
) 

Давайте вставить некоторые выборочные данные

Insert into Movies (ID,Actor,MovieName, ReleaseDate) 
Select 1,'Sean Connery', 'Gone gone wild', '2/1/2014' 
Union 
Select 2,'Roberta Jones', 'My first love', '2/1/2014' 
Union 
Select 3,'Michael Young', 'Booba spirit', '2/1/2014' 
Union 
Select 4,'Sean Conenry', 'Gone gone wild 2', '10/1/2014' 
Union 
Select 5,'Roberta Jones', 'My Second Love', '2/3/2015' 
Union 
Select 6,'Michael Young', 'Boboa spirit 2', '2/2/2016' 
Union 
Select 7,'Sean Connery', 'Gone gone wild 3', '2/1/2015' 
Union 
Select 8,'Sean Connery', 'Gone gone wild 4', '2/1/2016 

Я хотел бы знать, актер, дата выпуска и номер фильмов для каждого актера в течение каждого года, но возвращать только год с наибольшим количеством фильмов.

Вот запрос, который прекрасно работает на SQL Server

Select * from Movies 

select Actor, Release, NbrMovies 
From (Select Actor, Release, NbrMovies, rank() over (partition by Actor Order By NbrMovies desc) as rn 
     From (Select Actor, year(ReleaseDate) as Release, count(*) as NbrMovies 
      From Movies 
      Group by Actor, year(ReleaseDate) 
      ) x 
    ) y 
where rn = 1 

Я хотел бы знать, если есть способ, чтобы написать запрос без какого-либо окна функции, как ранг() или row_number(), потому что я используйте его также для Oracle.

Спасибо

+1

Oracle поддерживает как 'rank()', так и 'row_number()', поэтому ваш запрос также должен работать там. –

ответ

0

Ваш запрос подходит как для SQL Server, так и для Oracle. Тем не менее, вы можете удалить один уровень подзапросов:

select Actor, ReleaseYear, NbrMovies 
from (Select Actor, year(ReleaseDate) as ReleaseYear, 
      count(*) as NbrMovies, 
      rank() over (partition by Actor Order By count(*) desc) as rn 
     From Movies m 
     Group by Actor, year(ReleaseDate) 
    ) m 
where rn = 1; 
+0

Как бы вы написали фильтр «Отфильтровать группу» для максимального количества? – Edward

+0

Это не нужно. Этот запрос выполняется как в Oracle, так и в SQL Server. –

+0

Я понимаю, но я пытался понять, если бы это была возможность использовать фильтр таким образом, прежде чем когда-либо попасть в агрегирование оконных рядов; тем самым не нужно делать это в подзапрос. – Edward

Смежные вопросы