oracle 请帮助查找此任务的解决方案或帮助检查

whhtz7ly  于 2022-11-22  发布在  Oracle
关注(0)|答案(1)|浏览(116)

表格:犯罪、嫌疑人
嫌疑犯中谁的刑期最长?
在结果表中显示名称、日期(以年、月和日表示)。使用变量可以缩短查询和子查询中使用的表达式。
我找不到最长的刑期。
表犯罪
可疑表格
【【enter image description here】(https://i.stack.imgur.com/DBCPo.png)】(https://i.stack.imgur.com/PNBSu.png)等等......
我尝试查找监狱的开始日期和结束日期
从犯罪中选择犯罪标识、结束日期-开始日期作为监狱日期;
然后试着用年月和日期来写
选择犯罪标识,TRUNC((结束日期,开始日期)之间的月数/12)年,TRUNC((结束日期,开始日期)之间的月数-(TRUNC((结束日期,开始日期)之间的月数/12)*12))月数,TRUNC(((结束日期,开始日期)之间的月数- TRUNC((结束日期,开始日期)之间的月数))*30)犯罪天数;
并从嫌疑人自然加入犯罪中选择姓名、(select end_date-start_date as Prison_date from crimes);
不管失败了,谁能帮我找到解决的办法?

wi3ka0sx

wi3ka0sx1#

连接 suspect_id ( 不是 crime_id ) 上 的 两 个 表 , 并 获得 句子 开头 和 结尾 之间 的 差异 , 然后 按 句子 长度 的 降 序 对 表 进行 排序 , 并 获取 第 一 行 ( 带有 连接 ) 以 找到 最 大 值 :

SELECT s.name,
       FLOOR(MONTHS_BETWEEN(c.end_date, c.start_date) / 12) AS years,
       FLOOR(MOD(MONTHS_BETWEEN(c.end_date, c.start_date), 12)) AS months,
       31 * MOD(MONTHS_BETWEEN(c.end_date, c.start_date), 1) AS days
FROM   crime c
       INNER JOIN suspects s
       ON c.suspect_id = s.suspect_id
ORDER BY
       MONTHS_BETWEEN(c.end_date, c.start_date) DESC
FETCH FIRST ROW WITH TIES;

中 的 每 一 个
如果 您 使用 的 是 Oracle 11 或 更 早 版本 , 则 可以 使用 RANK 分析 函数 :

SELECT *
FROM   (
  SELECT s.name,
         FLOOR(MONTHS_BETWEEN(c.end_date, c.start_date) / 12) AS years,
         FLOOR(MOD(MONTHS_BETWEEN(c.end_date, c.start_date), 12)) AS months,
         31 * MOD(MONTHS_BETWEEN(c.end_date, c.start_date), 1) AS days,
         RANK() OVER (ORDER BY MONTHS_BETWEEN(c.end_date, c.start_date) DESC) AS rnk
  FROM   crime c
         INNER JOIN suspects s
         ON c.suspect_id = s.suspect_id
)
WHERE  rnk = 1;

格式

相关问题