2016-01-21 105 views
-1

我試圖去掌握使用函數Partition生成結果,不幸的是我正在處理別人沒有主鍵的表設計,我不能添加一個「可怕的我知道「SQL Server:分區

我的示例代碼如下

CREATE TABLE mytable (OrderNo varchar(20), TaskNo int, Hours Decimal(2)) 

insert into mytable values ('GNR68003327','0001',1) 
insert into mytable values ('GNR68003327','0002',2) 
insert into mytable values ('GNR68003327','0002',2) 
insert into mytable values ('GNR68003327','0002',2) 
insert into mytable values ('GNR68003327','0003',0) 
insert into mytable values ('GNR68003327','0004',0) 
insert into mytable values ('GNR68003327','0005',0) 
insert into mytable values ('GNR68003327','0006',0) 
insert into mytable values ('GNR68003327','0007',4) 
insert into mytable values ('GNR68003327','0007',4) 
insert into mytable values ('GNR68003327','0007',4) 
insert into mytable values ('GNR68003327','0007',4) 

我知道我可以只使用一個獨特得到以下的結果,但在這種情況下,我將使用分區的更好,由於這是隻是一個示例我正在嘗試這麼做,還有更多的事情要做。

我想要做的每TaskNo變化返回Hours列的第一個值,所以結果應該是

OrderNo  TaskNo Hours 
GRN68003327 0001 1 
GRN68003327 0002 2 
GRN68003327 0003 0 
GRN68003327 0004 0 
GRN68003327 0005 0 
GRN68003327 0006 0 
GRN68003327 0007 4 

我認爲它應該是這個樣子,但我只是不能得到所要求的結果

SELECT 
    OrderNo, TaskNo, 
    First_Value(Hours) OVER (PARTITION BY OrderNo ORDER BY TaskNo) 
FROM 
    mytable 

如果有人可以幫助它將不勝感激。

感謝菲爾

+0

我假設你正在使用SQL 2012,因爲你使用'First_Value'函數?如果是這樣,那麼SQL 2008標記不適用。 –

+0

嗨Stanley,是的,我使用SQL Server 2012,謝謝P – PJD

回答

1

你會使用row_number()

select t.* 
from (select t.*, 
      row_number() over (partition by orderno, taskno order by ??) as seqnum 
     from mytable t 
    ) t 
where seqnum = 1; 

請注意,在查詢??。 SQL表格代表無序集合。一組中沒有第一行或最後一行。您需要一個指定排序的列。無論那一列是什麼,都可以用它作爲??

+0

嗨戈登,感謝您的答覆,這是非常感謝你的答案。 P – PJD

1

你必須TaskNoOrderNo分區得到你想要的結果。由於您沒有任何有意義的方式來訂購這些分區內的行,您只需訂購TaskNo,但不能保證每次都會得到相同的「第一」記錄,而不需要某種訂購指示器:

SELECT OrderNo, 
     TaskNo, 
     First_Value(Hours) OVER (PARTITION BY OrderNo , TaskNo ORDER BY TaskNo) 
FROM mytable 
+0

也謝謝答案D – PJD