DatabaseCreation: dml.sql

File dml.sql, 8.8 KB (added by 231020, 5 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-- =========================================
57-- TRADE REQUEST (~6M)
58-- =========================================
59INSERT INTO trade_request (portfolio_id, price_per_unit, quantity, status, stock_symbol, timestamp, type)
60SELECT
61 (random()*9999 + 1)::BIGINT,
62 (100 + random()*10000),
63 (random()*100)::INT + 1,
64 (ARRAY['OPEN','CLOSED','CANCELLED'])[floor(random()*3+1)],
65 (ARRAY['ALK','KMB','STB','MPT','GRNT','REPL','TNB','TTK'])[floor(random()*8+1)],
66 NOW() - (random() * INTERVAL '1000 minutes'),
67 (ARRAY['BUY','SELL'])[floor(random()*2+1)]
68FROM generate_series(1, 6000000);
69
70-- =========================================
71-- TRADE TRANSACTION (~3M)
72-- =========================================
73INSERT INTO trade_transaction (price, quantity, timestamp, type, origin, user_id, stock_id)
74SELECT
75 tr.price_per_unit,
76 tr.quantity,
77 tr.timestamp,
78 tr.type,
79 CASE WHEN random() > 0.7 THEN 'EXTERNAL' ELSE 'INTERNAL' END,
80 p.user_id,
81 (random()*7 + 1)::BIGINT
82FROM trade_request tr
83JOIN portfolios p ON tr.portfolio_id = p.id
84WHERE tr.status = 'CLOSED'
85LIMIT 3000000;
86
87-- =========================================
88-- BROKER ORDER (~1M)
89-- =========================================
90INSERT INTO broker_order (order_type, limit_price, quantity, status, executed_price, broker_fee, mse_reference_number, submitted_at, executed_at, trade_request_id)
91SELECT
92 tr.type,
93 tr.price_per_unit,
94 tr.quantity,
95 CASE WHEN tr.status = 'CLOSED' THEN 'EXECUTED' ELSE 'PENDING' END,
96 tr.price_per_unit,
97 (random()*50),
98 'MSE-' || tr.id,
99 tr.timestamp,
100 tr.timestamp + INTERVAL '5 minutes',
101 tr.id
102FROM trade_request tr
103LIMIT 1000000;
104
105-- =========================================
106-- ORDER MATCHING LOG (~2M)
107-- =========================================
108INSERT INTO order_matching_log (broker_order_id, checked_price, result, checked_at)
109SELECT
110 (random()*999999 + 1)::BIGINT,
111 (100 + random()*10000),
112 (ARRAY['MATCHED','NO_MATCH','PARTIAL'])[floor(random()*3+1)],
113 NOW() - (random() * INTERVAL '1000 minutes')
114FROM generate_series(1, 2000000);
115
116-- =========================================
117-- PAYMENT TRANSACTION (~200K)
118-- =========================================
119INSERT INTO payment_transaction (amount, type, status, timestamp, bank_account_id)
120SELECT
121 (random()*100000)::BIGINT,
122 (ARRAY['DEPOSIT','WITHDRAWAL'])[floor(random()*2+1)],
123 (ARRAY['PENDING','SUCCESS','FAILED'])[floor(random()*3+1)],
124 NOW() - (random() * INTERVAL '1000 minutes'),
125 (random()*9999 + 1)::BIGINT
126FROM generate_series(1, 200000);
127
128-- =========================================
129-- PORTFOLIO HOLDINGS
130-- =========================================
131
132INSERT INTO portfolio_holdings (quantity, avg_price, stock_id, portfolio_id)
133SELECT
134 (random() * 500 + 1)::INT,
135 (random() * 10000 + 100)::NUMERIC(38,2),
136 (random() * 7 + 1)::BIGINT,
137 p.id
138FROM portfolios p, generate_series(1, 300);
139
140-- =========================================
141-- CFD POSITION (~50K)
142-- =========================================
143INSERT INTO CFD_position (status, quantity, profit_loss, opened_at, close_price, open_price, users_id, stock_id)
144SELECT
145 (ARRAY['OPEN','CLOSED'])[floor(random()*2+1)],
146 (random() * 100 + 1)::INT,
147 (random() * 10000 - 5000),
148 CURRENT_DATE - (random() * 365)::INT,
149 CASE WHEN random() > 0.5 THEN (random() * 10000 + 100) ELSE NULL END,
150 (random() * 10000 + 100),
151 (random() * 9999 + 1)::BIGINT,
152 (random() * 7 + 1)::BIGINT
153FROM generate_series(1, 50000);
154
155
156-- =========================================
157-- DIVIDEND (по 3 дивиденди за секоја акција)
158-- =========================================
159INSERT INTO dividend (amount_per_share, paymentDate, stock_id)
160SELECT
161 (random() * 500 + 10)::FLOAT8,
162 CURRENT_DATE - (random() * 365 * 3)::INT,
163 s.id
164FROM stock s, generate_series(1, 3);
165
166
167-- =========================================
168-- DIVIDEND PAYMENT (~100K)
169-- =========================================
170INSERT INTO dividend_payment (totalAmount, paid_at, dividend_id, users_id)
171SELECT
172 (random() * 10000 + 100)::FLOAT8,
173 d.paymentDate,
174 d.id,
175 (random() * 9999 + 1)::BIGINT
176FROM dividend d, generate_series(1, 4000);
177
178
179-- =========================================
180-- OAUTH PENDING LINKS (~5K)
181-- =========================================
182INSERT INTO oauth_pending_links (token, email, provider, expires_at, created_at, user_id)
183SELECT
184 md5('token' || i),
185 'user' || i || '@mail.com',
186 (ARRAY['GOOGLE','INTERNAL'])[floor(random()*2+1)],
187 NOW() + INTERVAL '1 hour',
188 NOW() - (random() * INTERVAL '60 minutes'),
189 i
190FROM generate_series(1, 5000) i;
191
192
193-- =========================================
194-- USER AUTH PROVIDERS (за секој user)
195-- =========================================
196INSERT INTO user_auth_providers (user_id, auth_providers)
197SELECT id, 'INTERNAL' FROM users;
198
199-- дел од корисниците и со GOOGLE
200INSERT INTO user_auth_providers (user_id, auth_providers)
201SELECT id, 'GOOGLE'
202FROM users
203WHERE id % 5 = 0;
204
205
206
207-- =========================================
208-- WATCHLIST (~30K)
209-- =========================================
210INSERT INTO watchlist (price_above, price_below, stock_id, user_id)
211SELECT
212 (random() * 5000 + 100)::FLOAT8,
213 (random() * 15000 + 6000)::FLOAT8,
214 (random() * 7 + 1)::BIGINT,
215 (random() * 9999 + 1)::BIGINT
216FROM generate_series(1, 30000);
217
218
219-- =========================================
220-- SETTLEMENT RECORD (~500K)
221-- потребен е broker_order_id кој постои
222-- =========================================
223INSERT INTO settlement_record (broker_order_id, user_id, stock_symbol, quantity, settled_price, total_cost, settlement_status, settled_at)
224SELECT
225 bo.id,
226 p.user_id,
227 tr.stock_symbol,
228 bo.quantity,
229 bo.executed_price,
230 bo.executed_price * bo.quantity,
231 (ARRAY['PENDING','SETTLED','FAILED'])[floor(random()*3+1)],
232 bo.executed_at
233FROM broker_order bo
234JOIN trade_request tr ON bo.trade_request_id = tr.id
235JOIN portfolios p ON tr.portfolio_id = p.id
236WHERE bo.status = 'EXECUTED'
237LIMIT 500000;
238
239-- =========================================
240-- VIEWS
241-- =========================================
242
243
244
245CREATE VIEW trade_transaction_detail_view AS
246SELECT
247 tt.id AS transaction_id,
248 tt.price,
249 tt.quantity,
250 tt.timestamp,
251 tt.type,
252 tt.origin,
253 tt.user_id,
254 tt.stock_id,
255 s.symbol,
256 s.name AS stock_name
257FROM trade_transaction tt
258JOIN stock s
259 ON tt.stock_id = s.id;
260
261
262CREATE VIEW trade_request_full_view AS
263SELECT
264 tr.id AS trade_request_id,
265 tr.portfolio_id,
266 tr.price_per_unit,
267 tr.quantity,
268 tr.status,
269 tr.stock_symbol,
270 tr.timestamp,
271 tr.type,
272 p.user_id
273FROM trade_request tr
274JOIN portfolios p
275 ON tr.portfolio_id = p.id;
276
277
278CREATE VIEW stock_history_detail_view AS
279SELECT
280 sh.id,
281 sh.stock_id,
282 s.symbol,
283 s.name AS stock_name,
284 sh.price,
285 sh.timestamp
286FROM stock_history sh
287JOIN stock s
288 ON sh.stock_id = s.id;
289
290
291
292--ANALYTICAL
293CREATE VIEW stock_daily_returns AS
294SELECT
295 stock_id,
296 timestamp,
297 price,
298 (price - LAG(price) OVER (PARTITION BY stock_id ORDER BY timestamp))
299 / NULLIF(LAG(price) OVER (PARTITION BY stock_id ORDER BY timestamp),0) AS daily_return
300FROM stock_history;
301
302