请教一简洁高效sql语句。

xieyunchao 2009-12-15 12:48:20
我有以下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过于复杂,不易于维护。

所以我想用分析函数来满足以上需求,多谢大家帮忙。
...全文
227 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
crazylaa 2009-12-15
  • 打赏
  • 举报
回复
表结构and测试数据的insert语句
and想要的效果。
楼主如果把这个提供出来了,相信那些大虾们一下子就给你解决拉。

ps:我不会,帮顶。
wojiaochenglong 2009-12-15
  • 打赏
  • 举报
回复
xuexi
小灰狼W 2009-12-15
  • 打赏
  • 举报
回复
或者
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

比较一下执行计划
小灰狼W 2009-12-15
  • 打赏
  • 举报
回复
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
KnowKjava 2009-12-15
  • 打赏
  • 举报
回复
insert
大P 2009-12-15
  • 打赏
  • 举报
回复
order by DT_FLWORINTERP desc,flw desc取第一条OK吗?
fcuandy 2009-12-15
  • 打赏
  • 举报
回复
从关系逻辑上来说,已经是最优化的SQL了, 先聚合再连接。

但是TO_CHAR(F.DT_FLWORINTERP, 'yyyy-mm-dd') || F.FLWNO 这样的语句,不明白你的意图,为什么要拼接FLWNO,

如果可以的话,可以考滤,子查询中不要拼接 FLWNO, 把它放在select和group by子句中, 与外表关联时, 也做为一个关联条件。

当然,有没有效要看你的索引情况。
xinwenhui2003 2009-12-15
  • 打赏
  • 举报
回复
将执行计划贴出来瞧瞧吧

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧