oracle 如何联接两个表以查找哪一行具有最大值

0x6upsns  于 2022-12-03  发布在  Oracle
关注(0)|答案(1)|浏览(172)

表格:犯罪、嫌疑人
嫌疑犯中谁的刑期最长?
在结果表中显示名称、日期(以年、月和日表示)。使用变量可以缩短查询和子查询中使用的表达式。
餐桌犯罪:

表怀疑:
x1c4d 1x指令集


指令集
等等......
我找不到最长的刑期。
我试图查找监狱的start_date和end_date:
从犯罪中选择犯罪标识、结束日期-开始日期作为监狱日期;
然后试着用年、月、日来写
选择犯罪标识,TRUNC((结束日期,开始日期)之间的月数/12)年,TRUNC((结束日期,开始日期)之间的月数-(TRUNC((结束日期,开始日期)之间的月数/12)*12))月数,TRUNC(((结束日期,开始日期)之间的月数- TRUNC((结束日期,开始日期)之间的月数))*30)犯罪天数;
并与嫌疑犯:
从自然参加犯罪嫌疑人中选择姓名,(从犯罪开始日期中选择结束日期-开始日期作为入狱日期);
但是失败了,我该如何解决呢?

j2qf4p5b

j2qf4p5b1#

连接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;

相关问题