Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 获得每个类别最多的租用电影_Oracle_Plsql - Fatal编程技术网

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)记录中的任何其他列