Oracle Group только по одному столбцу, но выбирает много столбцов

Типы объектов:

Theatre_t (tno: целое число, число: строка, город: строка, телефон: строка)

Star_t (число: строка, пол: char (l), дата рождения: дата) Stars_nt таблица звезд _t

Film_t (filmno: целое число, название: строка, язык: строка, режиссер: строка, бюджет: float, stars stars_nt)

Show_t (ссылка на фильм film_t, ссылка на театр theatre_t, startdate: date, enddate: date)

Таблицы

Театры theatre_t (первичный ключ тно)

Фильмы film_t (первичный ключ filmno) Вложенная таблица stars хранится как stars_ntb

Показ show_t (отсылки к фильмам, отсылки к театрам, кинотеатры)


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

Я пробовал много способов, но не могу этого добиться, так как в oracle sql мы не можем добавлять столбцы для выбора, которые не входят в группу. Мне нужно сгруппировать только по названию театра и отобразить название театра, название самого длинного фильма и город театра.


person Rashmika Gamage    schedule 12.11.2020    source источник
comment
Что вам нужно показать, если в конкретном кинотеатре есть два (или более) фильма, сыгранных в течение самого продолжительного периода времени?   -  person mathguy    schedule 12.11.2020
comment
тогда мне нужно показать оба фильма   -  person Rashmika Gamage    schedule 13.11.2020


Ответы (1)


Возможно, вам нужно расширение KEEP.

Например: "Покажи мне самую низкую зарплату в каждом отделе" легко.

SQL> select deptno, min(sal)
  2  from emp
  3  group by deptno;

но теперь вы хотите добавить, что у ВОЗ тоже самая низкая зарплата, и вы застрянете

SQL> select deptno, empno, min(sal)
  2  from emp
  3  group by deptno;

ORA-00979: not a GROUP BY expression

Вы можете использовать аналитическое предложение KEEP, чтобы помочь

 SQL> select
  2    deptno,
  3    min(sal),
  4    min(empno) keep ( dense_rank FIRST order by sal) empno,
  5    min(job) keep ( dense_rank FIRST order by sal)   job,
  6    min(ename) keep ( dense_rank FIRST order by sal) ename
  7  from emp
  8  group by deptno
  9  /

    DEPTNO   MIN(SAL)      EMPNO JOB       ENAME
---------- ---------- ---------- --------- ----------
        10       1300       7934 CLERK     MILLER
        20        800       7369 CLERK     SMITH
        30        950       7900 CLERK     JAMES

Полный набор руководств по аналитическому SQL, включая вышеперечисленное, можно найти здесь

https://www.youtube.com/watch?v=MoSp0nF0H8DHGtt&hl=ru >

person Connor McDonald    schedule 13.11.2020
comment
Спасибо за ответ, но что, если нам нужно добавить другие столбцы, такие как контактный номер сотрудника, как в вашем примере. это сложно, не так ли? - person Rashmika Gamage; 13.11.2020
comment
только если копировать / вставить сложно :-) Я добавил к исходному ответу - person Connor McDonald; 16.11.2020