DatabaseCreation: dml.sql

File dml.sql, 5.1 KB (added by 231020, 4 days ago)
Line 
1-- =========================================
2-- STOCK (REAL MSE DATA)
3-- =========================================
4INSERT INTO stock (symbol, name, current_price, last_price, percentage, turnover, last_updated)
5VALUES
6('ALK', 'Alkaloid AD Skopje', 18500, 18300, 1.09, 1200000, NOW()),
7('KMB', 'Komercijalna Banka', 8200, 8100, 1.23, 900000, NOW()),
8('STB', 'Stopanska Banka Bitola', 3100, 3050, 1.64, 300000, NOW()),
9('MPT', 'Makpetrol', 95000, 94000, 1.06, 500000, NOW()),
10('GRNT', 'Granit', 1200, 1180, 1.69, 150000, NOW()),
11('REPL', 'Replek', 25000, 24800, 0.80, 200000, NOW()),
12('TNB', 'Tutunska Banka', 7200, 7100, 1.40, 350000, NOW()),
13('TTK', 'Teteks', 500, 490, 2.04, 50000, NOW());
14
15-- =========================================
16-- USERS (~10K)
17-- =========================================
18INSERT INTO users (email, password, role, username)
19SELECT
20 'user' || i || '@mail.com',
21 md5('password' || i),
22 CASE WHEN i % 20 = 0 THEN 'ADMIN' ELSE 'USER' END,
23 'user' || i
24FROM generate_series(1, 10000) i;
25
26-- =========================================
27-- PORTFOLIOS
28-- =========================================
29INSERT INTO portfolios (balance, user_id)
30SELECT
31 (random() * 100000)::NUMERIC(18,2),
32 id
33FROM users;
34
35-- =========================================
36-- BANK ACCOUNTS
37-- =========================================
38INSERT INTO bank_account (account_number, bank, users_id)
39SELECT
40 1000000000 + id,
41 CASE WHEN id % 2 = 0 THEN 'Komercijalna Banka' ELSE 'NLB Banka' END,
42 id
43FROM users;
44
45-- =========================================
46-- STOCK HISTORY (~5M)
47-- =========================================
48INSERT INTO stock_history (price, stock_id, timestamp)
49SELECT
50 (100 + random()*10000),
51 (random()*7 + 1)::BIGINT,
52 CURRENT_DATE - (random()*3650)::INT
53FROM generate_series(1, 5000000);
54
55-- =========================================
56-- TRADE REQUEST (~6M)
57-- =========================================
58INSERT INTO trade_request (portfolio_id, price_per_unit, quantity, status, stock_symbol, timestamp, type)
59SELECT
60 (random()*9999 + 1)::BIGINT,
61 (100 + random()*10000),
62 (random()*100)::INT + 1,
63 (ARRAY['OPEN','CLOSED','CANCELLED'])[floor(random()*3+1)],
64 (ARRAY['ALK','KMB','STB','MPT','GRNT','REPL','TNB','TTK'])[floor(random()*8+1)],
65 NOW() - (random()*1000 || ' minutes')::INTERVAL,
66 (ARRAY['BUY','SELL'])[floor(random()*2+1)]
67FROM generate_series(1, 6000000);
68
69-- =========================================
70-- TRADE TRANSACTION (~3M)
71-- =========================================
72INSERT INTO trade_transaction (price, quantity, timestamp, type, origin, user_id, stock_id)
73SELECT
74 tr.price_per_unit,
75 tr.quantity,
76 tr.timestamp,
77 tr.type,
78 CASE WHEN random() > 0.7 THEN 'EXTERNAL' ELSE 'INTERNAL' END,
79 p.user_id,
80 (random()*7 + 1)::BIGINT
81FROM trade_request tr
82JOIN portfolios p ON tr.portfolio_id = p.id
83WHERE tr.status = 'CLOSED'
84LIMIT 3000000;
85
86-- =========================================
87-- BROKER ORDER (~1M)
88-- =========================================
89INSERT INTO broker_order (order_type, limit_price, quantity, status, executed_price, broker_fee, mse_reference_number, submitted_at, executed_at, trade_request_id)
90SELECT
91 tr.type,
92 tr.price_per_unit,
93 tr.quantity,
94 CASE WHEN tr.status = 'CLOSED' THEN 'EXECUTED' ELSE 'PENDING' END,
95 tr.price_per_unit,
96 (random()*50),
97 'MSE-' || tr.id,
98 tr.timestamp,
99 tr.timestamp + INTERVAL '5 minutes',
100 tr.id
101FROM trade_request tr
102LIMIT 1000000;
103
104-- =========================================
105-- ORDER MATCHING LOG (~2M)
106-- =========================================
107INSERT INTO order_matching_log (broker_order_id, checked_price, result, checked_at)
108SELECT
109 (random()*999999 + 1)::BIGINT,
110 (100 + random()*10000),
111 (ARRAY['MATCHED','NO_MATCH','PARTIAL'])[floor(random()*3+1)],
112 NOW() - (random()*1000 || ' minutes')::INTERVAL
113FROM generate_series(1, 2000000);
114
115-- =========================================
116-- PAYMENT TRANSACTION (~200K)
117-- =========================================
118INSERT INTO payment_transaction (amount, type, status, timestamp, bank_account_id)
119SELECT
120 (random()*100000)::BIGINT,
121 (ARRAY['DEPOSIT','WITHDRAWAL'])[floor(random()*2+1)],
122 (ARRAY['PENDING','SUCCESS','FAILED'])[floor(random()*3+1)],
123 NOW() - (random()*1000 || ' minutes')::INTERVAL,
124 (random()*9999 + 1)::BIGINT
125FROM generate_series(1, 200000);
126
127-- =========================================
128-- VIEWS
129-- =========================================
130
131-- 1. STOCK DAILY RETURNS
132CREATE VIEW stock_daily_returns AS
133SELECT
134 stock_id,
135 timestamp,
136 price,
137 (price - LAG(price) OVER (PARTITION BY stock_id ORDER BY timestamp))
138 / NULLIF(LAG(price) OVER (PARTITION BY stock_id ORDER BY timestamp),0) AS daily_return
139FROM stock_history;
140
141-- 2. USER PORTFOLIO VALUE
142CREATE VIEW user_portfolio_value AS
143SELECT
144 u.id AS user_id,
145 SUM(ph.quantity * s.current_price) AS total_value
146FROM users u
147JOIN portfolios p ON u.id = p.user_id
148JOIN portfolio_holdings ph ON p.id = ph.portfolio_id
149JOIN stock s ON ph.stock_id = s.id
150GROUP BY u.id;
151
152-- 3. MOST TRADED STOCKS
153CREATE VIEW most_traded_stocks AS
154SELECT
155 stock_id,
156 COUNT(*) AS trades_count,
157 SUM(quantity) AS total_volume
158FROM trade_transaction
159GROUP BY stock_id
160ORDER BY trades_count DESC;