2012-09-21 53 views
1

可能重複:
how to find missing value in sequence within groups in SQL?尋找失蹤MySQL的序列缺口

我和值列像

MAC00006300 
MAC00006301 
MAC00006302 
MAC00006305 
..... 
LED00006002 
........... 
LED00006008 
ALD18965 
ALD18967 
ALD18968 
....... 
ALD19000 

我需要值之間缺少

MAC00006303,MAC00006304 
LET00006003 ..... LET00006007 
ALD18969,ALD18970.....ALD18989 

SELECT NAME, VALUE + 1 
FROM testmissingexampledata mo 
WHERE NOT EXISTS 
     (
     SELECT NULL 
     FROM testmissingexampledata mi 
     WHERE mi.VALUE = mo.VALUE + 1 
     ) 
ORDER BY 
     VALUE; 

當我執行上述查詢時,我只能檢索下一個缺少的記錄。任何人都可以告訴我如何檢索所有缺失的記錄嗎?

回答

1

如果沒有所有可能的數值列表,則不能將缺少的行返回爲LEFT JOIN

這個查詢(這感覺就像它可能是更好的/強/快,但它的工作原理),會發現你的差距:

set @last_prefix = null; 
set @last_value = null; 
select result from (
    select @last_prefix, @last_value, name, 
     @prefix := substring(name,1,3) as prefix, 
     @value := substring(name,4) as value, 
     case when @prefix = @last_prefix and @value != @last_value +1 
     then concat ("gap from ", @prefix, ": ", @last_value+1, " to ", @value-1) 
     else "ok" end as result, 
     @last_prefix := @prefix, @last_value := @value 
     from t20120921 
) foo 
where result != "ok";