ORA-30483: window 此处不允许使用函数?
ORA-30483: window functions are not allowed here?
我需要显示具有特定平均评分的电影列表。我知道问题出在 HAVING 子句上,但我不确定如何解决它。如果没有该子句,它会起作用,并且它会列出所有符合指定品质的 movie/actor 组合,但我需要它们的平均评级也高于 4(这就是我试图对 having 子句所做的)。
对于 HAVING 子句,它表示 ORA-30483:此处不允许使用 window 函数。有人知道我该如何解决这个问题吗?
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
窗口或分析函数只允许在 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
分析函数不能在 WHERE
或 HAVING
块中使用。他们对 SELECT
块中的结果集进行计算。而且你使用 HAVING
而没有 GROUP 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
我需要显示具有特定平均评分的电影列表。我知道问题出在 HAVING 子句上,但我不确定如何解决它。如果没有该子句,它会起作用,并且它会列出所有符合指定品质的 movie/actor 组合,但我需要它们的平均评级也高于 4(这就是我试图对 having 子句所做的)。
对于 HAVING 子句,它表示 ORA-30483:此处不允许使用 window 函数。有人知道我该如何解决这个问题吗?
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
窗口或分析函数只允许在 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
分析函数不能在 WHERE
或 HAVING
块中使用。他们对 SELECT
块中的结果集进行计算。而且你使用 HAVING
而没有 GROUP 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