dbt Electronics kids

Order Product Affinity

Order Product Affinity model for electronics kids.

inferred

Blocks

order_product_affinity.sql · 61 lines
inferred
-- models/order_product_affinity.sql
{{ config(materialized='view') }}

SELECT name_a
, name_b
, joint_frequency
, toc1.name_frequency as name_a_frequency
, toc2.name_frequency as name_b_frequency
FROM (
  SELECT oc1.name as name_a
  , oc2.name as name_b
  , count(*) as joint_frequency
  FROM  (SELECT o.id as order_id
              , oi.variant_id as item_id
              , p.name as name
              FROM spree_line_items oi
              JOIN spree_orders o ON o.id = oi.order_id
              JOIN spree_variants ii ON oi.variant_id = ii.id
              JOIN spree_products p ON ii.product_id = p.id
              GROUP BY order_id, name
              ) as oc1
  JOIN  (SELECT o.id as order_id
              , oi.variant_id as item_id
              , p.name as name
              FROM spree_line_items oi
              JOIN spree_orders o ON o.id = oi.order_id
              JOIN spree_variants ii ON oi.variant_id = ii.id
              JOIN spree_products p ON ii.product_id = p.id
              GROUP BY order_id, name
              ) AS oc2 ON oc1.order_id = oc2.order_id
  GROUP BY name_a, name_b
) as prop
JOIN (SELECT p.name as name
      , count(distinct p.name, o.id) as name_frequency
      FROM spree_line_items oi
      JOIN spree_orders o ON o.id = oi.order_id
      JOIN spree_variants ii ON oi.variant_id = ii.id
      JOIN spree_products p ON ii.product_id = p.id
      GROUP BY p.name
      ) AS toc1 ON prop.name_a = toc1.name
JOIN (SELECT p.name as name
      , count(distinct p.name, o.id) as name_frequency
      FROM spree_line_items oi
      JOIN spree_orders o ON o.id = oi.order_id
      JOIN spree_variants ii ON oi.variant_id = ii.id
      JOIN spree_products p ON ii.product_id = p.id
      GROUP BY p.name
      ) AS toc2 ON prop.name_b = toc2.name
ORDER BY name_a, joint_frequency DESC, name_b

# models/schema.yml
version: 2

models:
  - name: order_product_affinity
    columns:
      - name: product_name_a
      - name: product_name_b
      - name: joint_frequency
      - name: product_a_frequency
      - name: product_b_frequency

Assumptions

  • materialized='view' is the default; no persist hint found.
  • schema.yml columns come from view dimensions; a primary_key dimension gets unique + not_null tests.
order_product_affinity.sql · 46 lines
source-preserved validation: parses
SELECT name_a
, name_b
, joint_frequency
, toc1.name_frequency as name_a_frequency
, toc2.name_frequency as name_b_frequency
FROM (
  SELECT oc1.name as name_a
  , oc2.name as name_b
  , count(*) as joint_frequency
  FROM  (SELECT o.id as order_id
              , oi.variant_id as item_id
              , p.name as name
              FROM spree_line_items oi
              JOIN spree_orders o ON o.id = oi.order_id
              JOIN spree_variants ii ON oi.variant_id = ii.id
              JOIN spree_products p ON ii.product_id = p.id
              GROUP BY order_id, name
              ) as oc1
  JOIN  (SELECT o.id as order_id
              , oi.variant_id as item_id
              , p.name as name
              FROM spree_line_items oi
              JOIN spree_orders o ON o.id = oi.order_id
              JOIN spree_variants ii ON oi.variant_id = ii.id
              JOIN spree_products p ON ii.product_id = p.id
              GROUP BY order_id, name
              ) AS oc2 ON oc1.order_id = oc2.order_id
  GROUP BY name_a, name_b
) as prop
JOIN (SELECT p.name as name
      , count(distinct p.name, o.id) as name_frequency
      FROM spree_line_items oi
      JOIN spree_orders o ON o.id = oi.order_id
      JOIN spree_variants ii ON oi.variant_id = ii.id
      JOIN spree_products p ON ii.product_id = p.id
      GROUP BY p.name
      ) AS toc1 ON prop.name_a = toc1.name
JOIN (SELECT p.name as name
      , count(distinct p.name, o.id) as name_frequency
      FROM spree_line_items oi
      JOIN spree_orders o ON o.id = oi.order_id
      JOIN spree_variants ii ON oi.variant_id = ii.id
      JOIN spree_products p ON ii.product_id = p.id
      GROUP BY p.name
      ) AS toc2 ON prop.name_b = toc2.name
ORDER BY name_a, joint_frequency DESC, name_b
order_product_affinity.view.lkml · 78 lines
inferred
view: order_product_affinity {
  derived_table: {
    sql: SELECT name_a
, name_b
, joint_frequency
, toc1.name_frequency as name_a_frequency
, toc2.name_frequency as name_b_frequency
FROM (
  SELECT oc1.name as name_a
  , oc2.name as name_b
  , count(*) as joint_frequency
  FROM  (SELECT o.id as order_id
              , oi.variant_id as item_id
              , p.name as name
              FROM spree_line_items oi
              JOIN spree_orders o ON o.id = oi.order_id
              JOIN spree_variants ii ON oi.variant_id = ii.id
              JOIN spree_products p ON ii.product_id = p.id
              GROUP BY order_id, name
              ) as oc1
  JOIN  (SELECT o.id as order_id
              , oi.variant_id as item_id
              , p.name as name
              FROM spree_line_items oi
              JOIN spree_orders o ON o.id = oi.order_id
              JOIN spree_variants ii ON oi.variant_id = ii.id
              JOIN spree_products p ON ii.product_id = p.id
              GROUP BY order_id, name
              ) AS oc2 ON oc1.order_id = oc2.order_id
  GROUP BY name_a, name_b
) as prop
JOIN (SELECT p.name as name
      , count(distinct p.name, o.id) as name_frequency
      FROM spree_line_items oi
      JOIN spree_orders o ON o.id = oi.order_id
      JOIN spree_variants ii ON oi.variant_id = ii.id
      JOIN spree_products p ON ii.product_id = p.id
      GROUP BY p.name
      ) AS toc1 ON prop.name_a = toc1.name
JOIN (SELECT p.name as name
      , count(distinct p.name, o.id) as name_frequency
      FROM spree_line_items oi
      JOIN spree_orders o ON o.id = oi.order_id
      JOIN spree_variants ii ON oi.variant_id = ii.id
      JOIN spree_products p ON ii.product_id = p.id
      GROUP BY p.name
      ) AS toc2 ON prop.name_b = toc2.name
ORDER BY name_a, joint_frequency DESC, name_b ;;
  }

  dimension: product_name_a {
    sql: ${TABLE}.name_a ;;
  }

  dimension: product_name_b {
    sql: ${TABLE}.name_b ;;
  }

  dimension: joint_frequency {
    type: number
    sql: ${TABLE}.joint_frequency ;;
  }

  dimension: product_a_frequency {
    type: number
    sql: ${TABLE}.name_a_frequency ;;
  }

  dimension: product_b_frequency {
    type: number
    sql: ${TABLE}.name_b_frequency ;;
  }

  measure: product_affinity {
    type: number
    sql: ${joint_frequency}/(${product_a_frequency}+${product_b_frequency}-${joint_frequency})*100 ;;
  }
}
order_product_affinity.view.lookml · 65 lines
source-preserved
- view: order_product_affinity
  derived_table:
    sql: SELECT name_a
, name_b
, joint_frequency
, toc1.name_frequency as name_a_frequency
, toc2.name_frequency as name_b_frequency
FROM (
  SELECT oc1.name as name_a
  , oc2.name as name_b
  , count(*) as joint_frequency
  FROM  (SELECT o.id as order_id
              , oi.variant_id as item_id
              , p.name as name
              FROM spree_line_items oi
              JOIN spree_orders o ON o.id = oi.order_id
              JOIN spree_variants ii ON oi.variant_id = ii.id
              JOIN spree_products p ON ii.product_id = p.id
              GROUP BY order_id, name
              ) as oc1
  JOIN  (SELECT o.id as order_id
              , oi.variant_id as item_id
              , p.name as name
              FROM spree_line_items oi
              JOIN spree_orders o ON o.id = oi.order_id
              JOIN spree_variants ii ON oi.variant_id = ii.id
              JOIN spree_products p ON ii.product_id = p.id
              GROUP BY order_id, name
              ) AS oc2 ON oc1.order_id = oc2.order_id
  GROUP BY name_a, name_b
) as prop
JOIN (SELECT p.name as name
      , count(distinct p.name, o.id) as name_frequency
      FROM spree_line_items oi
      JOIN spree_orders o ON o.id = oi.order_id
      JOIN spree_variants ii ON oi.variant_id = ii.id
      JOIN spree_products p ON ii.product_id = p.id
      GROUP BY p.name
      ) AS toc1 ON prop.name_a = toc1.name
JOIN (SELECT p.name as name
      , count(distinct p.name, o.id) as name_frequency
      FROM spree_line_items oi
      JOIN spree_orders o ON o.id = oi.order_id
      JOIN spree_variants ii ON oi.variant_id = ii.id
      JOIN spree_products p ON ii.product_id = p.id
      GROUP BY p.name
      ) AS toc2 ON prop.name_b = toc2.name
ORDER BY name_a, joint_frequency DESC, name_b
  fields:
  - dimension: product_name_a
    sql: ${TABLE}.name_a
  - dimension: product_name_b
    sql: ${TABLE}.name_b
  - dimension: joint_frequency
    type: number
    sql: ${TABLE}.joint_frequency
  - dimension: product_a_frequency
    type: number
    sql: ${TABLE}.name_a_frequency
  - dimension: product_b_frequency
    type: number
    sql: ${TABLE}.name_b_frequency
  - measure: product_affinity
    type: number
    sql: ${joint_frequency}/(${product_a_frequency}+${product_b_frequency}-${joint_frequency})*100

Contents

  • order_product_affinity.sql
  • order_product_affinity.sql
  • order_product_affinity.view.lkml
  • order_product_affinity.view.lookml