with a(aid, aa, ab) as (select 1, 'a', 'a' from dual union all select 2, 'b', 'b' from dual union all select 3, 'c', 'c' from dual union all select 4, 'd', 'd' from dual union all select 5, 'e', 'e' from dual), b(bid, baid, ba, bdate) as (select 1, 1, 'a', date '2015-10-01' from dual union all select 2, 1, 'b', date '2015-10-03' from dual union all select 3, 1, 'c', date '2015-10-09' from dual union all select 4, 3, 'd', date '2015-10-03' from dual union all select 5, 3, 'e', date '2015-10-05' from dual union all select 6, 5, 'f', date '2015-10-01' from dual) select aid, aa, ab, ba from (select a.aid, a.aa, a.ab, b.ba, row_number() over(partition by b.baid order by b.bdate desc) rn, b.bdate from a, b where a.aid = b.baid --① ) where rn = 1 --② ;
------解决思路----------------------
后面有加 where baid=b.baid的,你可以测试一下. 当然3楼的相对好理解 不过这两种语句的结果有可能是不一样的,就是相同的baid的最大bdate,存在有两条记录
------解决思路----------------------
with a(aid, aa, ab) as (select 1, 'a', 'a' from dual union all select 2, 'b', 'b' from dual union all select 3, 'c', 'c' from dual union all select 4, 'd', 'd' from dual union all select 5, 'e', 'e' from dual), b(bid, baid, ba, bdate) as (select 1, 1, 'a', date '2015-10-01' from dual union all select 2, 1, 'b', date '2015-10-03' from dual union all select 3, 1, 'c', date '2015-10-09' from dual union all select 4, 3, 'd', date '2015-10-03' from dual union all select 5, 3, 'e', date '2015-10-05' from dual union all select 6, 5, 'f', date '2015-10-01' from dual) select aid, aa, ab, ba from (select a.aid, a.aa, a.ab, b.ba, row_number() over(partition by b.baid order by b.bdate desc) rn, b.bdate from a, b where a.aid = b.baid --① ) where rn = 1 --② ;
with a(aid, aa, ab) as (select 1, 'a', 'a' from dual union all select 2, 'b', 'b' from dual union all select 3, 'c', 'c' from dual union all select 4, 'd', 'd' from dual union all select 5, 'e', 'e' from dual), b(bid, baid, ba, bdate) as (select 1, 1, 'a', date '2015-10-01' from dual union all select 2, 1, 'b', date '2015-10-03' from dual union all select 3, 1, 'c', date '2015-10-09' from dual union all select 4, 3, 'd', date '2015-10-03' from dual union all select 5, 3, 'e', date '2015-10-05' from dual union all select 6, 5, 'f', date '2015-10-01' from dual) select aid, aa, ab, ba from (select a.aid, a.aa, a.ab, b.ba, row_number() over(partition by a.aid order by b.bdate desc) rn, --baid 改成 aid b.bdate from a left join b --外关联。 on ( a.aid = b.baid) --① ) where rn = 1 --② order by aid ;