日期:2014-05-18  浏览次数:20906 次

求较好的算法
现在有这样一张表

代码(varchar(4))         时间(datetime)           内容(varchar(200))
0001                           2006-12-08                   gegegw
0001                           2006-11-07                   gewhh4
0001                           2006-10-01                   hhhfgweg
0001                           2006-08-05                     gewgg
......
0002                           2006-11-01                   g4h43h
0002                           2006-09-08                   gg4h3h
0002                           2006-08-02                   gwgg4
......
0003                           2006-06-07                   grhrehrehhreh
0003                           2006-05-05                   grhrhreh
0003                           2005-05-01                   ghsbre
......
0005                           2006-11-01                   ghsbre
......
说明
(以上为同一张表,大约20万条记录,更新是按时间插入新的记录,每月一个代码只有一条记录。
为了方便各位理解我是按代码、时间排了序。
不用考虑内容列)

现在想实现下面一张表
代码(varchar(4))       连续次数(int)     时间(datetime)
0001       3                 2006-12-08
0002     1 2006-11-01
0003       2 2006-06-07  
0004       0                 null
0005       1                 2006-11-01  

其中  
代码列   其实是从另外一张代码表,不过这里可以理解为源表的代码,只是在目的表中可能会出现如0004的情况。
时间列   是指   该代码在距离指定日期(如2007-01-01)最近一次在表中出现的时间。
连续次数列   是指   该代码距离指定日期(如2007-01-01)最近一次出现的,月份连续值。
(即,计算月份连续值时,不用考虑时间中的‘日’。当月份出现中断时,哪怕只有一个月,也只算中断月份以后的月数)


我自己到了一个算法,要分两次循环
第一次循环,先查出其中一家企业的出现的最后日期,再拿月份减一循环到中断月出现,返回循环次数
第二次循环,将代码表中的代码逐个用第一个循环运行

问题在于第二次循环。
代码表中一共有2万多个代码,运行起来,就算不死机,估计也需要很长时间能执行完
而系统要求,目的表的生成不能超过20分钟

不知道各位高手有没有更好的算法?




------解决方案--------------------
SELECT M.代码,(CASE WHEN COUNT(N.时间)=0 THEN 1 ELSE COUNT(N.时间)),M.时间
(select 代码,max(时间) as 时间 FROM 表 GROUP BY 代码) M LEFT JOIN
(select A.代码,A.时间 from 表 A LEFT JOIN 表 B
ON A.代码=B.代码 AND B.时间=(SELECT MAX(时间) FROM