Oracle 获得每个类别最多的租用电影
我有一个电影租赁数据库,我在这里工作,我试图找到每个类别最租用的电影。我想打印出标题和类别。以下是我的代码块:Oracle 获得每个类别最多的租用电影,oracle,plsql,Oracle,Plsql,我有一个电影租赁数据库,我在这里工作,我试图找到每个类别最租用的电影。我想打印出标题和类别。以下是我的代码块: declare type listOfCat is varray(10) of varchar2(10); categories listOfCat; movCount number(2); title varchar2(50); begin select distinct category bulk collect into categories from movie;
declare
type listOfCat is varray(10) of varchar2(10);
categories listOfCat;
movCount number(2);
title varchar2(50);
begin
select distinct category bulk collect into categories from movie;
for i in 1.. categories.count loop
select max(count) into movCount from
(select count(r.movie_id) as count, m.title as mov, m.CATEGORY as cat from rental r
join movie m on r.movie_id = m.movie_id
where m.category = categories(i)
group by m.title, m.CATEGORY
);
dbms_output.put_line(movCount || ' ' || categories(i));
end loop;
end;
现在的问题是,在这种情况下,我不知道如何获得电影标题。我尝试给max(count)一个别名并执行alias.mov,但当在末尾添加group by子句时,它给出了一个无效的标识符错误。另外,如果每个类别有几部电影,根据我在max(count)时得到的结果进行分组将再次分离结果。最后,我还尝试将movCount、mov和cat放入数组并并行显示,但这不能保证顺序正确
电影表具有电影id、标题、类别和可用数量。
租赁表包含电影id、客户id、到期日期、已返回
Customer表具有Customer\u id、name获取一个属性的
max
或min
的一种方法是使用KEEP
KEEP
函数按一个字段对数据进行排序,然后获取该属性中具有极值的记录,并通过max
或min
解析关系
下面是一些表的示例,这些表应与您提供的查询和表兼容:
创建测试表:
CREATE TABLE RENTAL(
MOVIE_ID NUMBER
);
CREATE TABLE MOVIE(
MOVIE_ID NUMBER,
TITLE VARCHAR2(64),
CATEGORY VARCHAR2(64)
);
并加载一些测试数据
INSERT INTO MOVIE VALUES(1,'The Fugitive','Thriller');
INSERT INTO MOVIE VALUES(2,'No Country for Old Men','Thriller');
INSERT INTO MOVIE VALUES(3,'The Martian','Sci-Fi');
INSERT INTO MOVIE VALUES(4,'Back To The Future','Sci-Fi');
INSERT INTO MOVIE VALUES(5,'Alien','Sci-Fi');
INSERT INTO RENTAL VALUES (1);
INSERT INTO RENTAL VALUES (2);
INSERT INTO RENTAL VALUES (3);
INSERT INTO RENTAL VALUES (3);
INSERT INTO RENTAL VALUES (5);
INSERT INTO RENTAL VALUES (1);
INSERT INTO RENTAL VALUES (3);
INSERT INTO RENTAL VALUES (4);
INSERT INTO RENTAL VALUES (5);
INSERT INTO RENTAL VALUES (1);
INSERT INTO RENTAL VALUES (4);
INSERT INTO RENTAL VALUES (2);
INSERT INTO RENTAL VALUES (1);
INSERT INTO RENTAL VALUES (3);
INSERT INTO RENTAL VALUES (2);
INSERT INTO RENTAL VALUES (2);
现在,如果我们查询以获得pl/sql块的一些初始期望值,我们可以看到我们在Thriller
类别中有一个联系:
SELECT MOVIE.TITLE, MOVIE.CATEGORY, COUNT(*) AS RENTAL_COUNT FROM MOVIE
INNER JOIN RENTAL
ON MOVIE.MOVIE_ID = RENTAL.MOVIE_ID
GROUP BY MOVIE.TITLE, MOVIE.CATEGORY
ORDER BY 2 ASC, 3 DESC;
TITLE CATEGORY RENTAL_COUNT
The Martian Sci-Fi 4
Alien Sci-Fi 2
Back To The Future Sci-Fi 2
No Country for Old Men Thriller 4
The Fugitive Thriller 4
因此,我们应该在科幻小说《火星人》中以《火星人》结尾,但我们需要用《保持》来解决这部惊悚片的关系
现在运行pl/sql块。我修改了查询,并将电影标题添加到此处的打印语句中,但基本相同。max count获得最高的出租次数,而KEEP
获得具有该出租次数的电影
declare
type listOfCat is varray(10) of varchar2(10);
categories listOfCat;
movCount number(2);
movieTitle varchar2(50);
begin
select distinct category bulk collect into categories from movie;
for i in 1.. categories.count loop
SELECT MIN(TITLE) KEEP (DENSE_RANK FIRST ORDER BY COUNT(*) DESC),
MAX(COUNT(*))
INTO movieTitle, movCount
FROM MOVIE
INNER JOIN RENTAL
ON MOVIE.MOVIE_ID = RENTAL.MOVIE_ID
WHERE MOVIE.CATEGORY = categories(i)
GROUP BY MOVIE.TITLE;
dbms_output.put_line(utl_lms.format_message('Category: %s, Most-Rented-Movie:%s, Rental-Count:%s',categories(i),movieTitle,to_char(movCount)));
end loop;
end;
/
结果:
Category: Sci-Fi, Most-Rented-Movie:The Martian, Rental-Count:4
Category: Thriller, Most-Rented-Movie:No Country for Old Men, Rental-Count:4
在这种情况下,
MIN(TITLE)
解决了逃犯
和老年人无国家
之间的关系。您是否有机会在电影
和租赁
中提供数据样本?我想知道如果出现这种关系,您会怎么办?例如,如果一个类别中的最大租赁数量由该类别中的两部电影共享。以第一部电影为例,此处添加了每个表都知道的内容。谢谢你提供的额外数据。还有一个问题——这里需要PL/SQL吗?普通SQL查询可用吗?现在我看到了,可以获取我使用的max(count)记录中的任何其他列