2017-11-16 2 views
0

표시 할 특정 평균 등급의 영화 목록이 필요합니다. 나는 문제가 HAVING 절이 있다는 것을 알고 있지만, 문제를 해결하는 방법에 대해서는 확실하지 않습니다. 이 조항이 없으면 작동하고 지정된 품질을 따르는 모든 영화/배우 콤보를 나열하지만 평균 시청률이 4 이상이어야합니다 (이는 having 절을 사용하여 수행하려고 시도한 것입니다).ORA-30483 : 여기서는 창 함수를 사용할 수 없습니까?

HAVING 절을 사용하면 ORA-30483이 표시됩니다. 여기서 창 함수는 허용되지 않습니다. 아무도 내가 이걸 어떻게 고칠 수 있는지 아니?

SELECT DISTINCT m.title "Movie Title", 
    ROUND(AVG(r.rating) OVER (PARTITION BY m.movieid, a.actorid),2) "Average Rating", 
    a.afname||' '||a.alname "Name", 
    m.ryear 
FROM netflix.actors a JOIN netflix.movies_actors ma 
    ON a.actorid = ma.actorid 
JOIN netflix.movies m 
    ON ma.movieid = m.movieid 
JOIN netflix.ratings100 r 
    ON m.movieid = r.movieid 
JOIN netflix.movies_genres g 
    ON m.movieid = g.movieid 
WHERE a.gender LIKE 'F' 
    AND g.genrecode LIKE 'DRM' 
    AND m.ryear >= TO_CHAR(SYSDATE, 'yyyy')-12 
HAVING AVG(r.rating) OVER (PARTITION BY m.movieid, a.actorid) >= 4 
ORDER BY "Average Rating" desc 

답변

0

웹 로그 분석 기능은 WHERE 또는 HAVING BLOKS에서 사용할 수 없습니다. 그들은 SELECT -block에서 결과 집합에 대한 계산을합니다. 그리고 HAVINGGROUP BY없이 사용하면 오류입니다. 하위 쿼리를 사용하고 WHERE을 사용할 수 있다고 생각합니다.

SELECT * 
FROM 
    (
    SELECT DISTINCT m.title "Movie Title", 
     ROUND(AVG(r.rating) OVER (PARTITION BY m.movieid, a.actorid),2) "Average Rating", 
     a.afname||' '||a.alname "Name", 
     m.ryear 
    FROM netflix.actors a JOIN netflix.movies_actors ma 
     ON a.actorid = ma.actorid 
    JOIN netflix.movies m 
     ON ma.movieid = m.movieid 
    JOIN netflix.ratings100 r 
     ON m.movieid = r.movieid 
    JOIN netflix.movies_genres g 
     ON m.movieid = g.movieid 
    WHERE a.gender LIKE 'F' 
     AND g.genrecode LIKE 'DRM' 
     AND m.ryear >= TO_CHAR(SYSDATE, 'yyyy')-12 
) 
WHERE "Average Rating" >= 4 
ORDER BY "Average Rating" desc 
0

windowing 또는 분석 함수는 select 문에서만 사용할 수 있습니다. 그래서 당신은 다음과 같이 필터링 할 수 있습니다

select * from (
    SELECT DISTINCT m.title "Movie Title", 
     ROUND(AVG(r.rating) OVER (PARTITION BY m.movieid, a.actorid),2) "Average Rating", 
     a.afname||' '||a.alname "Name", 
     m.ryear 
    FROM netflix.actors a JOIN netflix.movies_actors ma 
     ON a.actorid = ma.actorid 
    JOIN netflix.movies m 
     ON ma.movieid = m.movieid 
    JOIN netflix.ratings100 r 
     ON m.movieid = r.movieid 
    JOIN netflix.movies_genres g 
     ON m.movieid = g.movieid 
    WHERE a.gender LIKE 'F' 
     AND g.genrecode LIKE 'DRM' 
     AND m.ryear >= TO_CHAR(SYSDATE, 'yyyy')-12 


    ) as f1 
    where f1.[Average Rating] >=4 
ORDER BY f1.[Average Rating] desc 
관련 문제