2016-07-28 5 views
0

Ich habe eine Tabelle mit 'Verträge', mit einer contractId als Primärschlüssel. In einer anderen Tabelle habe ich Preise, die sich auf diese Verträge beziehen (FK contractId). Ich musste vorher Preisunterschiede (Rendite) zwischen Preisen nach Verträgen und immer über einen bestimmten Zeitraum hinweg berechnen. Also habe ich gerade den Preis für jeden Tag in der Interessensliste abgeholt und ihn mit dem Preis vom Vortag für jeden Vertrag verglichen. Das war nicht zu schwer.Abrufen von SQL-Daten aus jeder n-ten Zeile nur

Jetzt muss ich wieder Renditen aus den gleichen Daten berechnen, aber immer Preise überspringen, die sich auf eine Anzahl (n) Verträge beziehen. so für n = 1 Ich überspringe nur einen Vertrag. Für n = 2 muss ich 2 Verträge überspringen ... Für jeden Vertrag muss ich die Rückkehr von zwei Preisen nach Datum wieder berechnen, aber wenn ich fertig bin mit sagen wir contractId = 1, muss ich über die Vertrag mit ContractID = 2 und von vorn beginnen kehrt ab dem Zeitpunkt der Berechnung, wo ich zurückkehrt für den Vertrag mit der id = 3. Eine Liste der Verträge wie diese sucht gestoppte Rechen:

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

Also für N = 1, i‘ d müssen Preise finden, die sich auf ContractIds beziehen:

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

Ich habe versucht, Lead und Offset aber zu verwenden Ich bin nicht in der Lage, einen Weg zu finden, Verträge richtig zu überspringen und die relevanten Verträge so zu verknüpfen, wie ich es brauche. Was fehlt mir? Vielen Dank im Voraus!

+0

Sie endgültig ersetzen könnten eine Zeilennummer zuweisen und nur die rownumber% n Zeilen aus einer Tabelle nehmen (WHERE rownumber% (n + 1) = 1 '), oder nur' WHERE (contractid - 100000)% (n + 1) = 1' – ZLK

Antwort

1

ein wenig Gefummel an der WHERE Nahm (Ich sollte die Kommentare gelesen habe), aber ich denke, das

Ihre gewünschten Ergebnisse erzeugt
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) 

Gibt

N = 2: 100001,100004,100007,100010 

Um die normalisierte Liste zurückzukehren Wählen Sie einfach mit

Select ContractId 
+0

Vielen Dank, das hat 'out of the box' funktioniert –

2

können Sie verwenden row_number() und Modulo-Arithmetik:

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