Changes between Initial Version and Version 1 of AdvancedReport11


Ignore:
Timestamp:
09/25/26 16:22:57 (5 days ago)
Author:
201178
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedReport11

    v1 v1  
     1= Анализа на кошничка: производи што најчесто се продаваат заедно =
     2
     3== Опис ==
     4
     5Извештајот ги прикажува паровите производи што најчесто се појавуваат во иста нарачка, со број на заеднички нарачки и коефициент на асоцијација. Користи само-спојување со потпрашалник за филтрирање на нарачки со повеќе од еден производ.
     6
     7== SQL решение ==
     8
     9{{{
     10CREATE OR REPLACE FUNCTION project.get_product_pairs()
     11RETURNS TABLE (
     12    product_a TEXT,
     13    product_b TEXT,
     14    category_a TEXT,
     15    category_b TEXT,
     16    co_occurrences BIGINT,
     17    support_a NUMERIC,
     18    confidence NUMERIC
     19)
     20LANGUAGE sql
     21AS $$
     22    WITH multi_item_orders AS (
     23        SELECT order_id
     24        FROM project.order_item
     25        GROUP BY order_id
     26        HAVING COUNT(DISTINCT product_id) > 1
     27    ),
     28    pairs AS (
     29        SELECT
     30            oi1.product_id AS p1,
     31            oi2.product_id AS p2,
     32            COUNT(DISTINCT oi1.order_id) AS co_occ
     33        FROM project.order_item oi1
     34        JOIN project.order_item oi2
     35            ON oi1.order_id = oi2.order_id
     36           AND oi1.product_id < oi2.product_id
     37        WHERE oi1.order_id IN (SELECT order_id FROM multi_item_orders)
     38        GROUP BY oi1.product_id, oi2.product_id
     39    ),
     40    product_totals AS (
     41        SELECT product_id, COUNT(DISTINCT order_id) AS total_orders
     42        FROM project.order_item
     43        GROUP BY product_id
     44    )
     45    SELECT
     46        pa.name::TEXT,
     47        pb.name::TEXT,
     48        ca.name::TEXT,
     49        cb.name::TEXT,
     50        pr.co_occ,
     51        ROUND((100.0 * pr.co_occ / NULLIF(pt_a.total_orders, 0))::numeric, 2),
     52        ROUND((100.0 * pr.co_occ / NULLIF(pt_a.total_orders, 0))::numeric, 2)
     53    FROM pairs pr
     54    JOIN project.product pa ON pa.product_id = pr.p1
     55    JOIN project.product pb ON pb.product_id = pr.p2
     56    JOIN project.category ca ON ca.category_id = pa.category_id
     57    JOIN project.category cb ON cb.category_id = pb.category_id
     58    JOIN product_totals pt_a ON pt_a.product_id = pr.p1
     59    WHERE pr.co_occ >= 1
     60    ORDER BY 5 DESC, 7 DESC
     61    LIMIT 50;
     62$$;
     63}}}
     64
     65== Релациона алгебра ==
     66
     67{{{
     68OI(order_id, product_id, quantity)
     69PR(product_id, name, category_id)
     70C(category_id, name)
     71
     72G1 ← γ order_id; COUNT(DISTINCT product_id) → cnt (OI)
     73F1 ← σ cnt > 1 (G1)
     74
     75J1 ← OI ⨝ OI.order_id = OI2.order_id ∧ OI.product_id < OI2.product_id OI2
     76F2 ← σ order_id ∈ π order_id (F1) (J1)
     77G2 ← γ p1, p2; COUNT(DISTINCT order_id) → co_occ (F2)
     78
     79G3 ← γ product_id; COUNT(DISTINCT order_id) → total_orders (OI)
     80
     81J2 ← G2 ⨝ G2.p1 = G3.product_id G3
     82J3 ← J2 ⨝ PR ⨝ C ⨝ PR ⨝ C
     83F3 ← σ co_occ ≥ 1 (J3)
     84
     85R ← π product_a, product_b, category_a, category_b, co_occurrences,
     86      support_a, confidence (F3)
     87
     88R_final ← τ co_occurrences DESC, confidence DESC (R)
     89}}}