在某张表中有个NUMBER字段,这个字段是按照月份生成的数字。如果正常情况从1到*****; 但是由于某种原因中间的某个数字就会被跳过;所以出现断号的情况。
如果判断某个月的这个字段都缺少哪些数字?
第一种;取得某月最大的数字,然后判断循环判断。除了这种还有没有其他的好的方法??
例如:
A类型编号为:1、2、3、4、6、9、10、11。 其中5、7、8是缺少的,我想把这3个数字找出来;
想请高手们,给点意见,用sql是否可以实现?
------解决方案--------------------------------------------------------
办法是有的,一条SQL搞定:
CREATE TABLE TEMP.TMPDIM(
TYPE VARCHAR(2),
TIME DATE,
NUM INTEGER
);
INSERT INTO TEMP.TMPDIM VALUES( 'AA ', '2007-05-01 ',1);
INSERT INTO TEMP.TMPDIM VALUES( 'AA ', '2007-05-02 ',2);
INSERT INTO TEMP.TMPDIM VALUES( 'AA ', '2007-05-03 ',3);
INSERT INTO TEMP.TMPDIM VALUES( 'AA ', '2007-05-04 ',6);
INSERT INTO TEMP.TMPDIM VALUES( 'AA ', '2007-05-05 ',7);
INSERT INTO TEMP.TMPDIM VALUES( 'AA ', '2007-05-06 ',10);
--生成连续数(NUM)
--其中NUM列就是你编号列,这个例子中缺少4,5,8,9,下面的TEMP表了生成1-10序列,然后再与原表TEMP.TMPDIM左连一下,就出来你缺少的4个编号了。
WITH T_DATE(MIN_NUM,MAX_NUM)AS (SELECT MIN(NUM) MIN_NUM,MAX(NUM) MAX_NUM FROM TEMP.TMPDIM),
TEMP(TYPE,ROWNUM,LEVEL) AS
(SELECT TYPE,MIN(NUM),1 FROM TEMP.TMPDIM GROUP BY TYPE
UNION ALL
SELECT TYPE,ROWNUM+1, LEVEL+1 FROM TEMP A, T_DATE B WHERE ROWNUM <= ( MAX_NUM - MIN_NUM) )
SELECT * FROM TEMP A LEFT JOIN TEMP.TMPDIM B ON A.ROWNUM=B.NUM WHERE B.NUM IS NULL;
输出:
'AA ' 4 4 '[Null] ' '[Null] ' '[Null] '
'AA ' 5 5 '[Null] ' '[Null] ' '[Null] '
'AA ' 8 8 '[Null] ' '[Null] ' '[Null] '
'AA ' 9 9 '[Null] ' '[Null] ' '[Null] '