2016-07-28 57 views
0

我有一個包含'contracts'的表,使用contractId作爲主鍵。 在另一張表中,我有與這些合同有關的價格(FK contractId)。 我之前必須計算按合同分組的價格之間的價格差異(回報),並且總是在特定的日期期間。所以我只是在利息期間提取每日價格,並將其與前一天的價格進行比較。這並不難。只從第n行檢索sql數據

現在我需要再次從相同的數據計算回報,但總是跳過與數量(n)合約相關的價格。 因此對於n = 1我只跳過一個合約。對於n = 2,我需要跳過2個合約... 對於每個合約,我需要再次計算兩個價格按日期的回報,但是一旦我完成了讓我們說contractId = 1,我需要跳過與contractId = 2,並重新開始之日起計算回報,我停止與合同ID = 3 列表中的合同計算的回報正在尋找這樣的合同:

ContractId ContractCode 
100001 NAM0899 
100002 NAM0999 
100003 NAM1099 
100004 NAM1199 
100005 NAM1299 
100006 NAM0100 
100007 NAM0200 
100008 NAM0300 
100009 NAM0400 
100010 NAM0500 

所以對於N = 1,我d需要找到與ContractIds相關的價格:

100001, 100003, 100005, 100007 
N = 2: 100001, 100004, 100007, 100010... 
N = 3: 100001, 100005, 100009, 100013... 

我試圖使用鉛和偏移但我無法找到正確跳過合同並按照需要將相關合同鏈接起來的方法。 我錯過了什麼? 在此先感謝!

+0

你可以指定一個行號,只能從表採取ROWNUMBER%n行('WHERE ROWNUMBER%(N + 1)= 1 ''),或者只是'WHERE(contractid - 100000)%(n + 1)= 1' – ZLK

回答

1

注意到關於WHERE小的改變(我看了評論),但我認爲這會產生你想要的結果

Declare @Table table (ContractId int,ContractCode varchar(25)) 
Insert Into @Table values 
(100001,'NAM0899'), 
(100002,'NAM0999'), 
(100003,'NAM1099'), 
(100004,'NAM1199'), 
(100005,'NAM1299'), 
(100006,'NAM0100'), 
(100007,'NAM0200'), 
(100008,'NAM0300'), 
(100009,'NAM0400'), 
(100010,'NAM0500') 

Declare @Rows int = 2 
Declare @RetVal varchar(max) = '' 
;with cteBase as (
    Select *,RowNr=Row_Number() over (Order By ContractId) from @Table 
) 
Select @RetVal = Replace(ltrim(rtrim(concat(@RetVal,' ',ContractId))),' ',',') 
From cteBase 
Where RowNr=1 or (RowNr-1) % (@Rows+1) = 0 
Order by RowNr 

Select RetVal=concat('N = ',@Rows,': ',@RetVal) 

退貨

N = 2: 100001,100004,100007,100010 

要返回歸一化的列表只需更換最終選擇與

Select ContractId 
+0

非常感謝,開箱即用的' –

2

您可以使用row_number()和模運算:

select loc.* 
from (select loc.*, 
       row_number() over (order by Contractid) as seqnum 
     from listOfContracts loc 
    ) loc 
where (seqnum - 1 % @n) = 0;