【发布时间】:2015-05-12 10:28:25
【问题描述】:
我正面临以下问题:我正在编写一个视图,其中我将多个表连接到一个人员表。我现在尝试加入合作伙伴表,但我只需要历史上最后一个有效的合作伙伴行:
合作伙伴表:
id,
name,
married_at,
divorced_at,
died_at,
someone_id
如您所见,它与您已婚/已婚的伴侣有关。一个人一次只能有一个合伙人,但历史上可以有几个合伙人。所以某人的最后一个伙伴(someone_id)可能是:
- 还活着,还结婚了
- 在世但离婚
- 死了“但仍然结婚”(所以有人是鳏夫)
我只需要找到某人的最后一个合作伙伴行。
到目前为止我得到了什么:
select *
from someone_table s
left join partners p on (p.someone_id = s.id and (p.divorced_at is null and p.died_at is null) )
但这 - 很明显 - 只给我那些还活着并且仍然结婚的伴侣。当然,这些伙伴是某人的最后一个伙伴,但最后一个伙伴离婚或死亡的所有其他“某人”不会出现在声明的结果中。我怎样才能得到其他的,每个人只有一排?
我还尝试了一个选择语句作为表格并使用 rownum
select *
from someone s,
(select * from partners p where p.someone_id = s.id and ROWNUM = 1 order by p.married_at)
但是这个语句总是失败并出现“invalied identifier s.id”错误
注意:表结构是固定的,不能更改。 DBMS 是 oracle。
提前致谢
编辑: 样本数据
partners_table
╔════╦═════════╦════════════╦═════════════╦════════════╦════════════╗
║ id ║ name ║ married_at ║ divorced_at ║ died_at ║ someone_id ║
╠════╬═════════╬════════════╬═════════════╬════════════╬════════════╣
║ 1 ║ partner ║ 01.01.2000 ║ ║ ║ 12 ║
║ 2 ║ honey1 ║ 15.01.2000 ║ 15.01.2001 ║ ║ 15 ║
║ 3 ║ honey2 ║ 16.02.2001 ║ ║ ║ 15 ║
║ 4 ║ beauty ║ 23.03.2005 ║ ║ 25.03.2005 ║ 16 ║
║ 5 ║ lady1 ║ 11.11.2000 ║ 11.12.2000 ║ ║ 20 ║
║ 6 ║ lady2 ║ 12.12.2000 ║ 01.01.2001 ║ ║ 20 ║
║ 7 ║ lady3 ║ 02.02.2001 ║ ║ 04.02.2004 ║ 20 ║
║ 8 ║ lady4 ║ 05.05.2005 ║ ║ ║ 20 ║
║ 9 ║ mate ║ 23.06.2003 ║ 12.12.2009 ║ ║ 25 ║
╚════╩═════════╩════════════╩═════════════╩════════════╩════════════╝
最后的历史行是:
╔════╦═════════╦════════════╦═════════════╦════════════╦════════════╗
║ id ║ name ║ married_at ║ divorced_at ║ died_at ║ someone_id ║
╠════╬═════════╬════════════╬═════════════╬════════════╬════════════╣
║ 1 ║ partner ║ 01.01.2000 ║ ║ ║ 12 ║
║ 3 ║ honey2 ║ 16.02.2001 ║ ║ ║ 15 ║
║ 4 ║ beauty ║ 23.03.2005 ║ ║ 25.03.2005 ║ 16 ║
║ 8 ║ lady4 ║ 05.05.2005 ║ ║ ║ 20 ║
║ 9 ║ mate ║ 23.06.2003 ║ 12.12.2009 ║ ║ 25 ║
╚════╩═════════╩════════════╩═════════════╩════════════╩════════════╝
【问题讨论】:
-
您能否用一些示例数据以及预期的输出来更新您的问题,好吗?还有,一个人的最后一个伴侣就不能死去离婚吗?
-
我添加了一些示例数据。如果有更多问题请评论
标签: sql oracle greatest-n-per-group