| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2980 人关注过本帖
标题:这个sql怎么优化,查询每月最早的一条记录,数据量有点大
取消只看楼主 加入收藏
z82100
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-3-1
结帖率:0
收藏
已结贴  问题点数:20 回复次数:2 
这个sql怎么优化,查询每月最早的一条记录,数据量有点大
batch_no  serial   trans_date   pay_acct_no   trans_amt .........(省略)
  666      789     2015-06-07     123456        6.55
  666      788     2015-06-07     123456        67.5
  777      123     2015-06-10     123456        63.55

数据大概是这样的,要取出每个月同一个账号最早的那一条记录,同一天batch_no  serial 用这两个字段判断。

本菜鸡写的sql是这样的。。。。
select c.trans_date, c.trans_amt
  from xxxxxx c
  where c.app_code = '123'
  and c.trans_date < date'2015-07-01'
  and c.trans_date > date'2015-06-01'
  and ((c.response = '0003' and c.respdesc like'%欠费%')
    or (c.response = '0021' and c.respdesc like'%透支%'))
  and not exists (select 1 from xxxxxx
          where pay_acct_no = c.pay_acct_no
          and (trans_date < c.trans_date
            or (batch_no < c.batch_no
                or(batch_no = c.batch_no and serial < c.serial))));
跑了好久才出来100条数据,求大牛指点指点。。。。
 
图片附件: 游客没有浏览图片的权限,请 登录注册

2016-03-01 17:29
z82100
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-3-1
收藏
得分:0 
回复 2楼 adxing0514
不对诶,top(1)是所有记录的第一条了,要求的是每个账号,即每个pay_acct_no的第一条,比如A账号有10条记录,B账号有50条记录,C账号有10条记录,要取出ABC各自最早的那一条
2016-03-02 10:26
z82100
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-3-1
收藏
得分:0 
回复 4楼 adxing0514
解决了,用row_number() OVER (PARTITION BY c.pay_acct_no ORDER BY c.trans_date,c.batch_no,c.serial),但是又遇到问题了。proc编译的时候row_number()报错
2016-03-02 14:33
快速回复:这个sql怎么优化,查询每月最早的一条记录,数据量有点大
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017911 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved