dbt Ecommerce fashion

Sku Recommendations

Sku Recommendations model for ecommerce fashion.

inferred

Blocks

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

WITH order_sku as (
SELECT
  orders.id AS "order_id",
  variants.sku AS "sku"
FROM store_line_items AS line_items
LEFT JOIN store_orders AS orders ON line_items.order_id = orders.id
LEFT JOIN store_variants AS variants ON line_items.variant_id = variants.id
GROUP BY orders.id, variants.sku
),
total_order_sku as (
SELECT
  variants.sku as "sku",
  count(distinct variants.sku || ' ' || orders.id) as sku_frequency
FROM store_line_items AS line_items
LEFT JOIN store_orders AS orders ON line_items.order_id = orders.id
LEFT JOIN store_variants AS variants ON line_items.variant_id = variants.id
GROUP BY variants.sku
)

SELECT sku_a
      , sku_b
      , joint_frequency
      , top1.sku_frequency as sku_a_frequency
      , top2.sku_frequency as sku_b_frequency
FROM (
        SELECT sku1.sku as sku_a
        , sku2.sku as sku_b
        , count(*) as joint_frequency
        FROM order_sku as sku1
        JOIN order_sku as sku2 ON sku1.order_id = sku2.order_id
        GROUP BY sku_a, sku_b
      ) as prop
JOIN total_order_sku as top1 ON prop.sku_a = top1.sku
JOIN total_order_sku as top2 ON prop.sku_b = top2.sku
ORDER BY sku_a, joint_frequency DESC, sku_b

# models/schema.yml
version: 2

models:
  - name: sku_recommendations
    columns:
      - name: sku_a
      - name: sku_b

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.
sku_recommendations.sql · 35 lines
source-preserved validation: parses
WITH order_sku as (
SELECT
  orders.id AS "order_id",
  variants.sku AS "sku"
FROM store_line_items AS line_items
LEFT JOIN store_orders AS orders ON line_items.order_id = orders.id
LEFT JOIN store_variants AS variants ON line_items.variant_id = variants.id
GROUP BY orders.id, variants.sku
),
total_order_sku as (
SELECT
  variants.sku as "sku",
  count(distinct variants.sku || ' ' || orders.id) as sku_frequency
FROM store_line_items AS line_items
LEFT JOIN store_orders AS orders ON line_items.order_id = orders.id
LEFT JOIN store_variants AS variants ON line_items.variant_id = variants.id
GROUP BY variants.sku
)

SELECT sku_a
      , sku_b
      , joint_frequency
      , top1.sku_frequency as sku_a_frequency
      , top2.sku_frequency as sku_b_frequency
FROM (
        SELECT sku1.sku as sku_a
        , sku2.sku as sku_b
        , count(*) as joint_frequency
        FROM order_sku as sku1
        JOIN order_sku as sku2 ON sku1.order_id = sku2.order_id
        GROUP BY sku_a, sku_b
      ) as prop
JOIN total_order_sku as top1 ON prop.sku_a = top1.sku
JOIN total_order_sku as top2 ON prop.sku_b = top2.sku
ORDER BY sku_a, joint_frequency DESC, sku_b
sku_recommendations.view.lkml · 71 lines
inferred
view: sku_recommendations {
  derived_table: {
    sql: WITH order_sku as (
SELECT
  orders.id AS "order_id",
  variants.sku AS "sku"
FROM store_line_items AS line_items
LEFT JOIN store_orders AS orders ON line_items.order_id = orders.id
LEFT JOIN store_variants AS variants ON line_items.variant_id = variants.id
GROUP BY orders.id, variants.sku
),
total_order_sku as (
SELECT
  variants.sku as "sku",
  count(distinct variants.sku || ' ' || orders.id) as sku_frequency
FROM store_line_items AS line_items
LEFT JOIN store_orders AS orders ON line_items.order_id = orders.id
LEFT JOIN store_variants AS variants ON line_items.variant_id = variants.id
GROUP BY variants.sku
)

SELECT sku_a
      , sku_b
      , joint_frequency
      , top1.sku_frequency as sku_a_frequency
      , top2.sku_frequency as sku_b_frequency
FROM (
        SELECT sku1.sku as sku_a
        , sku2.sku as sku_b
        , count(*) as joint_frequency
        FROM order_sku as sku1
        JOIN order_sku as sku2 ON sku1.order_id = sku2.order_id
        GROUP BY sku_a, sku_b
      ) as prop
JOIN total_order_sku as top1 ON prop.sku_a = top1.sku
JOIN total_order_sku as top2 ON prop.sku_b = top2.sku
ORDER BY sku_a, joint_frequency DESC, sku_b ;;
  }

  dimension: sku_a {
    sql: ${TABLE}.sku_a ;;
  }

  dimension: sku_b {
    sql: ${TABLE}.sku_b ;;
  }

  measure: joint_frequency {
    type: sum
    hidden: yes
    sql: ${TABLE}.joint_frequency ;;
  }

  measure: sku_a_frequency {
    type: sum
    hidden: yes
    sql: ${TABLE}.sku_a_frequency ;;
  }

  measure: sku_b_frequency {
    type: sum
    hidden: yes
    sql: ${TABLE}.sku_b_frequency ;;
  }

  measure: affinity {
    type: number
    value_format: "0.0%"
    sql: ${joint_frequency} / (${sku_a_frequency} + ${sku_b_frequency} - ${joint_frequency}) * 1.0 ;;
  }
}
sku_recommendations.view.lookml · 55 lines
source-preserved
- view: sku_recommendations
  derived_table:
    sql: WITH order_sku as (
SELECT
  orders.id AS "order_id",
  variants.sku AS "sku"
FROM store_line_items AS line_items
LEFT JOIN store_orders AS orders ON line_items.order_id = orders.id
LEFT JOIN store_variants AS variants ON line_items.variant_id = variants.id
GROUP BY orders.id, variants.sku
),
total_order_sku as (
SELECT
  variants.sku as "sku",
  count(distinct variants.sku || ' ' || orders.id) as sku_frequency
FROM store_line_items AS line_items
LEFT JOIN store_orders AS orders ON line_items.order_id = orders.id
LEFT JOIN store_variants AS variants ON line_items.variant_id = variants.id
GROUP BY variants.sku
)

SELECT sku_a
      , sku_b
      , joint_frequency
      , top1.sku_frequency as sku_a_frequency
      , top2.sku_frequency as sku_b_frequency
FROM (
        SELECT sku1.sku as sku_a
        , sku2.sku as sku_b
        , count(*) as joint_frequency
        FROM order_sku as sku1
        JOIN order_sku as sku2 ON sku1.order_id = sku2.order_id
        GROUP BY sku_a, sku_b
      ) as prop
JOIN total_order_sku as top1 ON prop.sku_a = top1.sku
JOIN total_order_sku as top2 ON prop.sku_b = top2.sku
ORDER BY sku_a, joint_frequency DESC, sku_b
  fields:
  - dimension: sku_a
    sql: ${TABLE}.sku_a
  - dimension: sku_b
    sql: ${TABLE}.sku_b
  - measure: joint_frequency
    type: sum
    sql: ${TABLE}.joint_frequency
  - measure: sku_a_frequency
    type: sum
    sql: ${TABLE}.sku_a_frequency
  - measure: sku_b_frequency
    type: sum
    sql: ${TABLE}.sku_b_frequency
  - measure: affinity
    type: number
    value_format: '0.0%'
    sql: ${joint_frequency} / (${sku_a_frequency} + ${sku_b_frequency} - ${joint_frequency}) * 1.0

Contents

  • sku_recommendations.sql
  • sku_recommendations.sql
  • sku_recommendations.view.lkml
  • sku_recommendations.view.lookml