【问题标题】:Oracle Group by only one column but select many columnsOracle 仅按一列分组,但选择多列
【发布时间】:2020-11-12 18:15:51
【问题描述】:

对象类型:

Theatre_t (tno:integer, nome:string, city:string, phone:string)

Star_t(名称:字符串,性别:字符(l),生日:日期) 星_t的stars_nt表

Film_t(电影编号:整数,标题:字符串,语言:字符串,导演:字符串, 预算:浮动,星星 stars_nt)

Show_t(电影参考电影_t,剧院参考 theatre_t,开始日期:日期,结束日期:日期)

表格

theatre_t 的剧院(tno 主键)

film_t 的电影(filmno 主键) 嵌套表 stars 存储为 stars_ntb

show_t 的放映(电影参考电影,剧院参考剧院)


我需要为每个影院获取播放时间最长的电影的名称。并显示影院名称、城市和电影名称。

我尝试了很多方法,但我无法实现它,因为在 oracle sql 中我们无法添加列以选择不在 group by 中的列。我只需要按剧院名称进行分组,并显示剧院名称最长运行的电影标题和剧院所在的城市。

【问题讨论】:

  • 如果给定影院有两部电影(或更多)与“播放时间最长”相关,您需要展示什么?
  • 我需要同时放映这两部电影

标签: oracle aggregates


【解决方案1】:

也许你需要 KEEP 扩展。

例如:“显示每个部门的最低工资”很简单

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

但现在你想加上 WHO 的薪水也是最低的,这让你陷入困境

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=0cjxYMxa1e4&list=PLJMaoEWvHwFIUwMrF4HLnRksF0H8DHGtt

【讨论】:

  • 感谢您的回答,但如果我们需要根据您的示例添加其他列,例如员工联系电话,该怎么办。这很复杂吧?
  • 仅当复制/粘贴很复杂时 :-) 我已添加到原始答案中
猜你喜欢
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
相关资源
最近更新 更多