我有以下sql语句:SELECT FL.*
  FROM AIDSZH_SGRA_ADULT_FLW FL,
       (SELECT CARD_ID,
               MAX(TO_CHAR(F.DT_FLWORINTERP, 'yyyy-mm-dd') || F.FLWNO) DT_FLWORINTERP
          FROM AIDSZH_SGRA_ADULT_FLW F
         WHERE F.DT_FLWORINTERP <= TO_DATE('2009-11-30', 'yyyy-mm-dd')
           AND F.ZONECODE LIKE '371081%'
         GROUP BY F.CARD_ID) FMAX
 WHERE ((TO_CHAR(FL.DT_FLWORINTERP, 'yyyy-mm-dd')) || FL.FLWNO) = FMAX.DT_FLWORINTERP
   AND FL.CARD_ID = FMAX.CARD_ID大意是这样的:我想取DT_FLWORINTERP最大的那条记录。如果DT_FLWORINTERP最大值有多条记录,那么我将会取这几条记录中flw最大的那条记录,以保证取出记录的唯一性,上述sql过于复杂,不易于维护。所以我想用分析函数来满足以上需求,多谢大家帮忙。

解决方案 »

  1.   

    从关系逻辑上来说,已经是最优化的SQL了, 先聚合再连接。但是TO_CHAR(F.DT_FLWORINTERP, 'yyyy-mm-dd') || F.FLWNO 这样的语句,不明白你的意图,为什么要拼接FLWNO, 如果可以的话,可以考滤,子查询中不要拼接 FLWNO, 把它放在select和group by子句中, 与外表关联时, 也做为一个关联条件。当然,有没有效要看你的索引情况。
      

  2.   

    order by DT_FLWORINTERP desc,flw desc取第一条OK吗?
      

  3.   

    SELECT CARD_ID,
                   MAX(TO_CHAR(F.DT_FLWORINTERP, 'yyyy-mm-dd') || F.FLWNO) DT_FLWORINTERP,
                   max(zonecode)keep(dense_rank last order by F.DT_FLWORINTERP,F.FLWNO)zonecode,
                   max(col1)keep(dense_rank last order by F.DT_FLWORINTERP,F.FLWNO)col1,
                   max(col2)keep...............
              FROM AIDSZH_SGRA_ADULT_FLW F
             WHERE F.DT_FLWORINTERP <= TO_DATE('2009-11-30', 'yyyy-mm-dd')
               AND F.ZONECODE LIKE '371081%'
             GROUP BY F.CARD_ID改成这样试试。keep
      

  4.   

    或者
    select * from(
      select f.*,row_number()over(partition by card_id order by DT_FLWORINTERP desc,FLWNO desc)rn
      from AIDSZH_SGRA_ADULT_FLW f)
    where rn=1比较一下执行计划