2014-03-26 55 views
-1

我想弄清楚如何在一個字段中插入一個序列號,用於匹配來自3個其他字段的組。T SQL數據組數據

我想我沒有解釋得這麼好。不知道RowNumber函數我試圖做一次一個光標去遍歷一個記錄,但它並不真正爲我工作,所以我想我會問是否有人知道一個更簡單的方法。我不知道如何通過這三個字段,po p0line和項目正確地進行修改。然後我也搜索了StackOverflow大約3個小時,而且我沒有發現類似於我的需要的東西。所以我發佈了這個問題。我有一個目前的條件和目標條件的例子,我想要做什麼,所以我不知道如果有人認爲這個描述不夠明確,還要怎麼說。

Declare @po_num nvarchar(10) 
Declare @po_line int 
Declare @po_release int 
Declare @item nvarchar(30) 
Declare @description nvarchar(40) 
declare @due_date datetime 
declare @CUR CURSOR 
SET @CUR = CURSOR LOCAL SCROLL STATIC 
FOR 
SELECT [po_num] 
     ,[po_line] 
     ,[po_release] 
     ,[item] 

    FROM [common].[dbo].[PO_ReleaseNumber] p 

order by po_num, po_line 
open @CUR 
fetch NEXT from @CUR 

into @po_num,@po_line,@po_release,@item 

WHILE @@FETCH_STATUS = 0 

BEGIN 

    update [common].[dbo].[PO_ReleaseNumber] set po_release = 1 
where po_num = @po_num and po_line = @po_line and item = @item 
    fetch NEXT from @CUR 
    into @po_num,@po_line,@po_release,@item 
    END 


CLOSE @CUR 
DEALLOCATE @CUR 
GO 

示例:這就是我現在所擁有的。

po_num | po_line | Item | due_date | Sequence Num 
----------------------------------------------------------- 
999  | 1  | thing1 | 01/01/2014 |   
999  | 1  | thing1 | 01/15/2014 |  
999  | 1  | thing1 | 01/30/2014 |  
999  | 2  | thing2 | 01/01/2014 |   
999  | 3  | thing2 | 02/13/2014 |   
999  | 3  | thing2 | 03/13/2014 |   
999  | 3  | thing2 | 04/13/2014 |   
999  | 3  | thing2 | 04/15/2015 | 

這是我想如何編號(sequenceNumber)或po_release號碼實際上。

po_num | po_line| Item | due_date | Sequence Num 
--------------------------------------------------------- 
999 | 1  | thing1 | 01/01/2014 | 1 
999 | 1  | thing1 | 01/15/2014 | 2 
999 | 1  | thing1 | 01/30/2014 | 3 
999 | 2  | thing2 | 01/01/2014 | 1 
999 | 3  | thing2 | 02/13/2014 | 1 
999 | 3  | thing2 | 03/13/2014 | 2 
999 | 3  | thing2 | 04/13/2014 | 3 
999 | 3  | thing2 | 04/15/2015 | 4 

因此該表應具有竟然出現了相同PO_num的每一個版本的版本號,PO_Line,用不同的發行日期項目和版本號丟失。所以我現在必須對所有這些數字進行編號。大約有75,000條記錄可以一起完成。

+3

這個問題似乎是題外話,因爲沒有嘗試所示 –

+0

對不起,我還以爲我被描述。但我看到吃桃子讓我迷上了它,並使它看起來更好。我需要了解如何在我看到的格式中設置文章格式。感謝您的輸入。 – morgaad1

回答

1

您可以使用row_number()

update [table] 
set sequenceNumber = 
    row_number() over (partition by po_num, po_line, item order by due_date) 

編輯:上述不起作用,因爲「窗函數只能出現在SELECT或ORDER BY子句」。

要解決該問題,可以使用select中的窗口函數(row_number)而不是外部語句的set來加入子查詢。

像這樣(再次,未經測試):

update t 
set sequenceNumber = s.rownum 
from [table] t 
join (
    select po_num, po_line, item, due_date, 
    row_number() over 
     (partition by s.po_num, s.po_line, s.item 
     order by s.due_date) as rownum 
) s on t.po_num=s.po_num and t.po_line=s.po_line and 
     t.item=s.item and t.due_date=s.due_date 
+0

我試過了,它給了我一個錯誤。 「窗口函數只能出現在SELECT或ORDER BY子句中。」謝謝 – morgaad1

+0

啊耶,編輯。 – Blorgbeard

+0

我知道了使用this.Select po_num, po_line, ROW_NUMBER()以上(由po_num分區,由DUE_DATE po_line順序)PO_release, 項, 描述, DUE_DATE 成common.dbo.PO_RELEASE 從共同.dbo.PO_releaseNumber – morgaad1