加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

在拉链表中取出某天为止表中的最新记录

(2013-10-28 15:59:59)
标签:

awk

gsub

双字段做分区

分类: 数据库类

业务场景:数据库中有张拉链表,存放了10,11,12,13年的记录,需要找出截止到2011.12.31号其表中的最新记录

注:拉链表即是在表中原有的结构中添加几列字段begin_dt(数据的开始日期),end_dt(数据结束日期),将每天的全量数据文件与前一天数据文件做比对,若前后两天主键相等,但其他字段值不同,则当天的数据文件为NU,前一天的数据文件为OU;若前后两天记录正行记录相等,则为不变的值即S;若当天存在但前一天没有的数据文件为A,若前一天有当当天没有的为删除文件D,将NU,S,A当天的数据文件为最新的记录,其BEGIN_DT为当天,end_dt为29991231(定义为此值的分区存放最新记录),而OU,D为历史记录begin_dt为数据原插入的日期,end_dt为前一天日期。

http://s13/mw690/003d54oKgy6DMhhgmCg8c&690

假设有张拉链表TAB1,其id为主键,值如下:

id  add    begin_dt     end_dt
      20100101     20100102
      20100103     29991231
      20120223     29991231

分析:由于需要找出在20111231号那天表中的最新记录,则BEGIN_DT时间应小于等于20111231,但只有这个条件将会把历史记录也查
      找出来,如表TAB1中的值只用BEGIN_DT为条件的话会找出1,2两条记录,但第一条记录是历史记录不应找出,因此我们需要
      再加一个END_DT大于20111231这个条件才不会查找出历史记录。
     
方法一:

        SELECT * FROM TAB1 WHERE BEGIN_DT<='20111231' AND END_DT>'20111231'
     
方法二:

       如果记录从表中卸出此表中所有记录,文本名为tab1.del:
          "1","a","20100101","20100120"
          "1","b","20100103","29991231"
          "2","a","20120223","29991231"
   使用awk对文本处理也可取出20111231的最新记录:
  
    awk -F , '{gsub(/"/,"");if($3<=20111231&&$4>20111231)print $0 }'  tab1.del

或者 awk -F , '{if($3<="\"20111231\""&&$4>"\"20111231\"")print $0 }'  tab1.del

注:gsub(r,s)函数是将记录中的所有r替换成s
   

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有