首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL只连接最后一个历史记录行。

SQL只连接最后一个历史记录行。
EN

Stack Overflow用户
提问于 2015-05-12 10:28:25
回答 4查看 138关注 0票数 1

我坐在下面的问题上:我正在编写一个视图,将几个表连接到一个person表中。现在我试图加入partners表,但是我只需要历史上的最后一个有效的合作伙伴行:

伙伴桌:

代码语言:javascript
运行
复制
id,
name,
married_at,
divorced_at,
died_at,
someone_id

如你所见,这是关于你结婚的伴侣的。一个人一次只能有一个伴侣,但历史上有几个伴侣。因此,某人(someone_id)的最后一个合伙人可能是:

  • 还活着,还结着婚
  • 活着但离婚
  • 死了“但仍然已婚”(所以有人是鳏夫)

我只需要为某人找到最后一排搭档。

到目前为止我得到的是:

代码语言:javascript
运行
复制
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) )

但这--很明显--只给了我还活着和已婚的伴侣。当然,这些伴侣是某人的最后一个伴侣,但所有其他“某人”谁是最后一个伴侣是离婚或死亡将不会在声明的结果。我如何得到其他的和只有一排为每一个人?

我还尝试了一个select语句作为表并使用rownum。

代码语言:javascript
运行
复制
select *
from someone s,
(select * from partners p where p.someone_id = s.id and ROWNUM = 1 order by p.married_at)

但是这条语句总是失败,出现了“无效标识符s.id”错误。

注意:表格结构是固定的,不能更改。DBMS是甲骨文。

提前感谢

编辑:样本数据

partners_table

代码语言:javascript
运行
复制
╔════╦═════════╦════════════╦═════════════╦════════════╦════════════╗
║ 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 ║
╚════╩═════════╩════════════╩═════════════╩════════════╩════════════╝

最后的历史行是:

代码语言:javascript
运行
复制
╔════╦═════════╦════════════╦═════════════╦════════════╦════════════╗
║ 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 ║
╚════╩═════════╩════════════╩═════════════╩════════════╩════════════╝
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-05-12 11:12:16

这应该能做你想做的事:

代码语言:javascript
运行
复制
with partners (id, name, married_at, divorced_at, died_at, someone_id) as (select 1, 'partner', to_date('01/01/2000', 'dd/mm/yyyy'), null, null, 12 from dual union all
                                                                           select 2, 'honey1', to_date('15/01/2000', 'dd/mm/yyyy'), to_date('15/01/2001', 'dd/mm/yyyy'), null, 15 from dual union all
                                                                           select 3, 'honey2', to_date('16/02/2001', 'dd/mm/yyyy'), null, null, 15 from dual union all
                                                                           select 4, 'beauty', to_date('23/03/2005', 'dd/mm/yyyy'), null, to_date('25/03/2005', 'dd/mm/yyyy'), 16 from dual union all
                                                                           select 5, 'lady1', to_date('11/11/2000', 'dd/mm/yyyy'), to_date('11/12/2000', 'dd/mm/yyyy'), null, 20 from dual union all
                                                                           select 6, 'lady2', to_date('12/12/2000', 'dd/mm/yyyy'), to_date('01/01/2001', 'dd/mm/yyyy'), null, 20 from dual union all
                                                                           select 7, 'lady3', to_date('02/02/2001', 'dd/mm/yyyy'), null, to_date('04/02/2004', 'dd/mm/yyyy'), 20 from dual union all
                                                                           select 8, 'lady4', to_date('05/05/2005', 'dd/mm/yyyy'), null, null, 20 from dual union all
                                                                           select 9, 'mate', to_date('23/06/2003', 'dd/mm/yyyy'), to_date('12/12/2009', 'dd/mm/yyyy'), null, 25 from dual)
select id,
       name,
       married_at,
       divorced_at,
       died_at,
       someone_id
from   (select id,
               name,
               married_at,
               divorced_at,
               died_at,
               someone_id,
               row_number() over (partition by someone_id order by married_at desc) rn
        from   partners)
where  rn = 1;

        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
票数 3
EN

Stack Overflow用户

发布于 2015-05-12 10:43:08

如果我理解你的问题(我相信我理解你的问题),你应该这样做:

代码语言:javascript
运行
复制
SELECT *
FROM someone_table s
left join (
    SELECT *
    FROM (
        SELECT *
        FROM partners p
        WHERE p.someone_id = s.id
        ORDER BY GREATEST(died_at, divorced_at, married_at)
    ) x
    WHERE ROWNUM = 1 
 ) y

注意:我不是甲骨文,我大部分的工作都是在使用服务器,但是according to this post greatest应该在oracle数据库上工作。

票数 1
EN

Stack Overflow用户

发布于 2015-05-12 11:40:43

方法1

代码语言:javascript
运行
复制
SELECT 
    * 
FROM 
    partners 
WHERE 
    someone_id = $someone_id 
AND 
    married_at = (SELECT MAX(married_at) FROM partners WHERE someone_id = $someone_id GROUP BY someone_id);

方法2

代码语言:javascript
运行
复制
SELECT 
    p.*
FROM
    partners p
INNER JOIN
(
    SELECT 
        someone_id, MAX(married_at) as lastmarried_at
    FROM 
        partners
    GROUP BY
        someone_id
) m
ON m.someone_id = p.someone_id AND m.lastmarried_at = p.married_at
where p.someone_id in ($someone_id1, $someone_id2);

注意:用实际值替换$someone_id

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30188181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档