aboutsummaryrefslogtreecommitdiffstats
path: root/sql
diff options
context:
space:
mode:
Diffstat (limited to 'sql')
-rw-r--r--sql/dawn.sql25
1 files changed, 25 insertions, 0 deletions
diff --git a/sql/dawn.sql b/sql/dawn.sql
index 423755a6..20088b70 100644
--- a/sql/dawn.sql
+++ b/sql/dawn.sql
@@ -230,6 +230,31 @@ BEGIN
END;
$$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE function query_positions(p_type text DEFAULT NULL)
+RETURNS text AS $$
+DECLARE
+ query text;
+
+BEGIN
+ query := 'WITH tmp AS (SELECT cds.security_id, cds.security_desc, cds.maturity, %s
+SUM(cds.notional * (CASE WHEN cds.protection=''Buyer'' THEN -1 ELSE 1 END))
+OVER (PARTITION BY cds.security_id, cds.maturity, cds.attach, cds.detach) AS notional
+FROM cds WHERE cds.trade_date <=$1 %s)
+SELECT DISTINCT ON (tmp.security_id, tmp.maturity %s) * FROM tmp WHERE tmp.notional!=0';
+
+IF p_type = 'tranche' THEN
+ RETURN format(query, 'cds.attach, cds.detach,', 'AND cds.attach is NOT NULL', ',tmp.attach');
+ELSIF p_type = 'cds' THEN
+ RETURN format(query, '', 'AND cds.attach is NULL AND cds.folder!=''MBSCDS''', '');
+ELSIF p_type = 'abs' THEN
+ RETURN format(query, '', 'AND cds.folder=''MBSCDS''', '');
+ELSE
+ RETURN format(query, 'cds.attach, cds.detach,', '', ',tmp.attach');
+END IF;
+END;
+$$ LANGUAGE plpgsql;
+
CREATE OR REPLACE function list_cds_positions (p_date date)
RETURNS TABLE(security_id varchar(12), security_desc varchar(32), maturity date, attach smallint,
detach smallint, notional float) AS $$