2012-08-13 96 views
0

這聽起來像一個問題,應該在我考上大學的考試中,但我向你保證這是我試圖解決的現實世界問題......並且我不是一個真正的SQL專家。假設我銷售相機(虛構),並且每臺相機都有自己的[前綴] - [數字]格式的唯一序列號。我們在更換固件或更換新電腦芯片時會更改前綴。相機具有3年的MFG保修期,因此我們試圖給我們的經銷商提供序列號,以表示「任何序列號在J05之下的相機-123456可能已經太舊了,請將其發回「SQL字符串解析,然後按日期塊排序和排序

問題是,我們依次生產相機,但隨後50臺相機將坐在我們倉庫的貨架上,並且運輸人員將隨機抓取並運送所以它們是半順序銷售的,但是可能會有大量的異常值,其中幾個單位被擱置了幾個月後才賣出。

大約有1000萬連續劇。任何好方法來完成這個?

 
Serial  | Sale Date 
J22-521253 | 7/2/12 
J22-521254 | 6/28/12 
J22-521255 | 6/28/12 
J22-521256 | 7/1/12 
J22-521257 | 6/22/12 
J22-521258 | 7/4/12 
J22-521259 | 7/1/12 
J22-521260 | 6/27/12 
J22-521261 | 6/25/12 
J22-521262 | 6/20/12 
J22-521263 | 8/30/12 
J22-521264 | 6/30/12 
J22-521265 | 6/30/12 
Y7-542127 | 5/1/12 
Y7-542128 | 4/18/12 
Y7-542129 | 4/22/12 
Y7-542130 | 1/10/12 
+0

對於1000萬行,不會有這樣做的有效方式,對不起。無論您使用CHARINDEX等進行什麼樣的技巧,子串匹配和數據類型轉換都將導致1000萬行的表掃描。 – 2012-08-13 18:05:33

+0

可能要添加前綴列並在其上添加索引。要獲得前綴: SELECT LEFT(Serial,CHARINDEX(Serial,' - ') - 1) – Jim 2012-08-13 18:07:53

+0

我假設您要將查詢放入應用程序。實現這一目標的一種方法是將數據集實現爲夜間工作的一部分,以創建一個只有前綴和第一個序列號在一定範圍內的較小表格。你可以在前綴上索引,它會超快。 – 2012-08-13 18:13:36

回答

0

我在解釋這個問題,說你想讓每個前綴的最早序列號仍在保修期內。任何舊的會太舊。

請澄清問題,如果不是這種情況。

select prefix, salesdate, serial 
from (select left(serial, 3) as prefix, 
      row_number() over (partition by prefix order by salesdate) as seqnum 
     from (select t.*, left(serial, 3) as prefix 
      from t 
      where datediff(days, salesdate, CURRENT_TIMESTAMP) < 3*365.25 
      ) t 
    ) t 

這使用row_number()來查找仍在保修期內的最早序列。