表:
施工序号        施工内容   起始深度 结束深度
1 AC 1198.000 2116.000
2 AC 2088.000 2900.000 --》想提取的记录
3 AC 2818.000 3190.000
2 DEN 2088.000 2900.000 --》想提取的记录
3 DEN 2818.000 3190.000我想提取在同一个施工序号内,且同时包含AC和DEN,并且起始深度和结束深度之间距离最大的那两条记录。
注:同一个施工序号的起始深度和结束深度一致。
请教SQL语句的写法。谢谢!

解决方案 »

  1.   

    with temp as (
    select 1 id,'AC' content,1198.000 sd,2116.000 ed from dual
    union all
    select 2 id,'AC' content,2088.000 sd,2900.000 ed from dual
    union all
    select 3 id,'AC' content,2818.000 sd,3190.000 ed from dual
    union all
    select 2 id,'DEN' content,2088.000 sd,2900.000 ed from dual
    union all
    select 3 id,'DEN' content,2818.000 sd,3190.000 ed from dual
    )
    select id,content,sd,ed from (
    select id,content,sd,ed, row_number() over(partition by esdd order by esdd) rn from(
    select id,content,sd,ed,max(ed-sd) esdd from temp
     where id in (select id from temp group by id having count(id)>1)
    group by id,content,sd,ed
    )
    ) where rn = 1 order by id
      

  2.   

    谢谢 Phoenix_99 的回答!返回结果是:
    ID   content   sd   ed  
    2 AC 2088 2900
    3 AC 2818 3190
    但不是我要的结果。我要的是
    2 AC ...
    2 DEN ...
    那两条记录。各位,还有别的方法吗?
      

  3.   

    with temp as (
    select 1 id,'AC' content,1198.000 sd,2116.000 ed from dual
    union all
    select 2 id,'AC' content,2088.000 sd,2900.000 ed from dual
    union all
    select 3 id,'AC' content,2818.000 sd,3190.000 ed from dual
    union all
    select 2 id,'DEN' content,2088.000 sd,2900.000 ed from dual
    union all
    select 3 id,'DEN' content,2818.000 sd,3190.000 ed from dual
    )
    select id,content,sd,ed from (
    select id,content,sd,ed,max(ed-sd) esdd from temp
     where id in (SELECT t.id FROM temp t  WHERE t.content = 'AC'
                  INTERSECT 
                  SELECT t.id FROM temp t WHERE t.content = 'DEN')
    group by id,content,sd,ed
    ORDER BY esdd DESC)
    WHERE ROWNUM<3
      

  4.   

    谢谢zhang的耐心解答。完全正确,并从中学会了不少