| | 1 | = Најпрометни часови во денот = |
| | 2 | |
| | 3 | == Опис == |
| | 4 | |
| | 5 | Извештајот го прикажува бројот на нарачки и вкупниот приход групирани по час од денот. Овозможува идентификување на најпрометните периоди. |
| | 6 | |
| | 7 | == SQL решение == |
| | 8 | |
| | 9 | {{{ |
| | 10 | CREATE OR REPLACE FUNCTION get_busiest_hours() |
| | 11 | RETURNS TABLE ( |
| | 12 | hour_of_day NUMERIC, |
| | 13 | order_count BIGINT, |
| | 14 | total_items BIGINT, |
| | 15 | total_revenue NUMERIC, |
| | 16 | avg_order_value NUMERIC |
| | 17 | ) |
| | 18 | LANGUAGE plpgsql |
| | 19 | AS $$ |
| | 20 | BEGIN |
| | 21 | RETURN QUERY |
| | 22 | SELECT |
| | 23 | EXTRACT(HOUR FROM o.created_at) AS hour_of_day, |
| | 24 | COUNT(DISTINCT o.order_id) AS order_count, |
| | 25 | SUM(oi.quantity) AS total_items, |
| | 26 | SUM(oi.quantity * oi.unit_price) AS total_revenue, |
| | 27 | ROUND(AVG(oi.quantity * oi.unit_price), 2) AS avg_order_value |
| | 28 | FROM project.orders o |
| | 29 | JOIN project.order_item oi ON oi.order_id = o.order_id |
| | 30 | WHERE o.status = 'ПЛАТЕНА' |
| | 31 | GROUP BY EXTRACT(HOUR FROM o.created_at) |
| | 32 | ORDER BY total_revenue DESC; |
| | 33 | END; |
| | 34 | $$; |
| | 35 | }}} |
| | 36 | |
| | 37 | == Релациона алгебра == |
| | 38 | |
| | 39 | {{{ |
| | 40 | O(order_id, created_at, status) |
| | 41 | OI(order_id, quantity, unit_price) |
| | 42 | |
| | 43 | J1 ← O ⨝ O.order_id = OI.order_id OI |
| | 44 | |
| | 45 | F1 ← σ status='ПЛАТЕНА' (J1) |
| | 46 | |
| | 47 | G ← γ hour_of_day; |
| | 48 | COUNT(DISTINCT order_id) → order_count, |
| | 49 | SUM(quantity) → total_items, |
| | 50 | SUM(quantity * unit_price) → total_revenue, |
| | 51 | AVG(quantity * unit_price) → avg_order_value (F1) |
| | 52 | |
| | 53 | R ← π hour_of_day, order_count, total_items, total_revenue, avg_order_value (G) |
| | 54 | |
| | 55 | R_final ← τ total_revenue DESC (R) |
| | 56 | }}} |