| | 1 | = Clients ordered by number of orders |
| | 2 | {{{#!sql |
| | 3 | CREATE OR REPLACE FUNCTION get_clients_by_number_of_orders() |
| | 4 | RETURNS TABLE ( |
| | 5 | client_id INT, |
| | 6 | client_name TEXT, |
| | 7 | number_of_orders BIGINT |
| | 8 | ) |
| | 9 | LANGUAGE plpgsql |
| | 10 | AS $$ |
| | 11 | BEGIN |
| | 12 | RETURN QUERY |
| | 13 | SELECT |
| | 14 | c.client_id, |
| | 15 | c.name AS client_name, |
| | 16 | COUNT(DISTINCT o.order_num) AS number_of_orders |
| | 17 | FROM client c |
| | 18 | JOIN makes_order mo |
| | 19 | ON c.client_id = mo.client_id |
| | 20 | JOIN "order" o |
| | 21 | ON mo.order_num = o.order_num |
| | 22 | GROUP BY |
| | 23 | c.client_id, |
| | 24 | c.name |
| | 25 | ORDER BY |
| | 26 | number_of_orders DESC; |
| | 27 | END; |
| | 28 | $$; |
| | 29 | |
| | 30 | }}} |
| | 31 | |
| | 32 | == Relational Algebra |
| | 33 | - O(order_num, quantity, status, last_modified_date, payment_method, discount) |
| | 34 | - C(client_id, name, first_name, last_name, email, password, delivery_address) |
| | 35 | - MO(client_id, order_num) |
| | 36 | |
| | 37 | |
| | 38 | **JOIN clients with their orders:** |
| | 39 | - J1 ← C ⨝C.client_id = MO.client_id MO |
| | 40 | - J2 ← J1 ⨝MO.order_num = O.order_num O |
| | 41 | |
| | 42 | **Calculate number of distinct orders for each lient:** |
| | 43 | - R ← γclient_id, name; |
| | 44 | COUNT(DISTINCT order_num) → number_of_orders |
| | 45 | (J2) |
| | 46 | |
| | 47 | **Sort by total numebr of orders:** |
| | 48 | - R_final ← τnumber_of_orders DESC(R) |
| | 49 | |
| | 50 | |