2015-10-11 47 views
-3

如何使用MySQL,我怎樣才能最好地查詢一個約100,000行的表,以找到序列號中的缺失值,型號爲。例如,查找時鐘收音機(下面的型號#123)和計算器(下面的型號345)內缺少的序列號。在MySQL中尋找型號中的序列號空白

的數據看起來像這樣:

型號,序列#


123,1
123,2
123,4
123,5
345,101
345,104
345,105
345,106

所需輸出將是

型號,序列#


123,3
345,102
345,103

注意,序列號有每個型號的不同起始值。

謝謝!

+1

那麼,您嘗試過哪些SQL /代碼? – user3791372

+0

你會怎樣處理丟失的數字 – Strawberry

回答

0

很難找到那些丟失的東西。獲得差距要容易得多。因此,這將返回缺少第一個丟失的序列和數量:

select t.serial + 1 as FirstMissing, 
     (t.next_serial - t.serial) - 1 as numMissing 
from (select t.*, 
      (select t2.serial 
       from data t2 
       where t2.model = t.model and t2.serial > t.serial 
       order by t2.serial asc 
       limit 1 
      ) as next_serial 
     from data t 
    ) t 
where next_serial <> serial + 1; 
+0

謝謝 - 非常感謝 – ChrisCode

0

要確定的東西並不在該表中,您可以LEFT JOIN到該表和測試結果是否IS NULL。例如,給定任何(模型,序列)對,您可以構建預期遵循給定序列的(模型,序列)對。這是相同的型號,序列號較大。然後LEFT JOIN該表與自己的條件是(模型,序列)對等於預期的。對於任何缺少的序列號,自加入別名IS NULL中的每個列,因此只添加一個WHERE條件,只保留那些行。

以下內容將幫助您入門。它確定了每個差距的開始,但不是所有差距中的數字。

-- List all rows in table serials 
-- 1. which aren't the highest for a given SKU, and 
-- 2. for which the following serial number doesn't exist for the same SKU 
SELECT ser1.sku, ser1.serial_num + 1 AS serial_num 
FROM serials AS ser1 
INNER JOIN (
    SELECT sku, MAX(serial_num) AS serial_num 
    FROM serials 
    GROUP BY sku 
) AS sermax 
ON (ser1.sku = sermax.sku 
    AND ser1.serial_num < sermax.serial_num) 
LEFT JOIN serials AS ser2 
ON (ser1.sku = ser2.sku 
    AND ser1.serial_num + 1 = ser2.serial_num) 
WHERE ser2.serial_num IS NULL 

輸出:

sku|serial_num 
123|  3 
345|  102 

代碼在這個答案是雙重許可:CC BY-SA 3.0MIT License as published by OSI

+0

非常感謝 - 我正在努力研究找出所有丟失的serial_num值與第一個丟失的值。如果任何人有這方面的提示,將非常感激。 – ChrisCode