2012-03-31 18 views
0

Ich habe einen Datensatz von Wertpapierpreisen in einer Datenbank. Die Daten werden wie folgt strukturiert:SQL-Match-Zeilen basierend auf 2 Kriterien

id  security_id  time_to_maturity  price 
001   01    1.5    100.45 
002   01    1.3    101.45 
003   01    1.1    102.45 
004   01    1.02    101.45 
005   01    1.0    101.45 
006   03    22.3    94.45 
007   03    22.1    96.45 
008   03    21.8    98.45 
009   05    4.2    111.45 
010   05    4.1    112.45 
011   05    3.8    111.45 
... 

id die row_id und security_id ist die ID jeder Sicherheit. Ich versuche nur Daten aus einem bestimmten Zeitbereich für jedes Wertpapier zu bekommen. Zuerst habe ich eine Abfrage ausführen, die min und max für jedes Wertpapier-ID zu finden, finden dann die Differenz zwischen dem minimalen und maximalen und schließlich einen Wert finden, wie diese 10% mehr als das Minimum ist:

SELECT security_id, MIN(time_to_maturity), MAX(time_to_maturity), 
    MAX(time_to_maturity) - MIN(time_to_maturity) tDiff, 
    ((MAX(time_to_maturity) - MIN(time_to_maturity)) * .1) + MIN(time_to_maturity) 
    FROM db1 
    group by security_id 
    order by security_id 

Dies gibt mich wie folgt zusammen:

security_id min()  max()  diff  min+(diff*.1) 
    01    1.0  1.5  .5   1.05 
    03   21.8  22.3  .5   21.85 
    05    3.8  4.2  .4   3.84 

Schließlich, was ich wählen tun möchte ist von den wichtigsten Datensatz nur die Zeilen für jede security_id wo die time_to_maturity is < min+(diff*.1).

Ich bin mir nicht sicher, wie es zu strukturieren, da ich glaube, ich brauche eine Schleife, um Daten von security_id, dann von time_to_maturity is < min+(diff*.1).

Die Antwort würde wie folgt aussehen:

id  security_id  time_to_maturity  price 
004   01    1.02    101.45 
005   01    1.0    101.45 
008   03    21.8    98.45 
011   05    3.8    111.45 

Irgendwelche Vorschläge?

+0

Ist Ihre Frage zu MySQL oder über SQL Server? Sie sind nicht das Gleiche. –

Antwort

1
SELECT A.id,B.security_id,A.time_to_maturity,A.price 
FROM db1 A, 
(
SELECT security_id, MIN(time_to_maturity) AS min_time_to_maturity, MAX(time_to_maturity) AS max_time_to_maturity, 
    MAX(time_to_maturity) - MIN(time_to_maturity) tDiff, 
    ((MAX(time_to_maturity) - MIN(time_to_maturity)) * .1) + MIN(time_to_maturity) 
    FROM db1 
    group by security_id 
    order by security_id 
) B 
WHERE A.security_id = B.security_id 
    AND A.time_to_maturity < (B.min_time_to_maturity+(B.tdiff*0.1)); 

PS: Dies funktioniert nur in MYSQL.

1

Sie hat nicht gesagt, welche Version von SQL Server Sie waren, aber vorausgesetzt, es ist 2005+, können Sie einen allgemeinen Tabellenausdruck verwenden:

with cte as ( 
    SELECT security_id, 
     ((MAX(time_to_maturity) - MIN(time_to_maturity)) * .1) + MIN(time_to_maturity) as threshold 
    FROM db1 
    group by security_id 
) 
select id, db1.security_id, time_to_maturity, price 
from db1 
inner join cte 
    on db1.security_id = cte.security_id 
where time_to_maturity < threshold 
+1

Ich werde auch bemerken, dass Sie eine kleine Algebra in Ihrem Ausdruck für den Schwellenwert tun können, um es zu vereinfachen. Ich überlasse das dem Leser als Übung. ;) –

Verwandte Themen