wiki:AdvancedTopics

Version 2 (modified by 231020, 3 days ago) ( diff )

--

Напредни теми

Data Cube ( Trade Analytics Cube )

Структурата има 5 димензии: корисник, акција (stock), година, месец и тип на трансакција (BUY/SELL). Со овие димензии се овозможува детална и агрегирана анализа на податоците од различни аспекти.

Со користење на GROUP BY CUBE се добиваат сите можни комбинации на овие димензии, што значи дека се формираат вкупно 2⁵ = 32 кубоиди. За секој кубоит се пресметуваат неколку метрики: вкупна вредност на тргувањата (price * quantity), вкупна количина на извршени трансакции и број на трансакции.

Редовите каде некоја димензија е NULL претставуваат агрегирани подзбирови, а со користење на GROUPING() функцијата јасно се разликуваат од реални NULL вредности во податоците. Овој пристап овозможува длабинска анализа на пазарното однесување на корисниците и перформансите на акциите низ различни временски периоди.

Дополнително, овој Data Cube овозможува лесно откривање на трендови и шаблони во тргувањето, како што се најтргувани акции, најактивни корисници и сезонски промени во активноста. Со тоа се подобрува можноста за донесување аналитички одлуки и подлабоко разбирање на однесувањето на корисниците во системот.

CREATE INDEX idx_tt_user ON trade_transaction(user_id);
CREATE INDEX idx_tt_stock ON trade_transaction(stock_id);
CREATE INDEX idx_tt_time ON trade_transaction(timestamp);

SELECT
    u.username,
    s.symbol,
    EXTRACT(YEAR FROM tt.timestamp)  AS year,
    EXTRACT(MONTH FROM tt.timestamp) AS month,
    tt.type,
    SUM(tt.price * tt.quantity)      AS total_trade_value,
    SUM(tt.quantity)                 AS total_quantity,
    COUNT(*)                         AS trade_count,
    GROUPING(u.username)             AS is_all_users,
    GROUPING(s.symbol)               AS is_all_stocks,
    GROUPING(tt.type)                AS is_all_types
FROM trade_transaction tt
JOIN users u ON tt.user_id  = u.id
JOIN stock s ON tt.stock_id = s.id
GROUP BY CUBE (
    u.username,
    s.symbol,
    EXTRACT(YEAR  FROM tt.timestamp),
    EXTRACT(MONTH FROM tt.timestamp),
    tt.type
)
ORDER BY u.username, s.symbol;
Note: See TracWiki for help on using the wiki.