SQL Car manufacture

Idle Time

Idle Time model for car manufacture.

source-preserved

Blocks

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

WITH sessions as(
SELECT session.session_id, session.car_id, session.session_start_time, session.session_end_time,
sum(IFNULL("user".usr_id,0)) as user_list,
rank() over (partition by session.car_id order by session.session_id) as rank
FROM unite_db_stage.session AS session
INNER JOIN unite_db_stage.usr_in_session AS user_in_session ON session.session_id=user_in_session.session_id
INNER JOIN unite_db_stage.usr AS "user" ON ("user".usr_id)=user_in_session.usr_id
where session_type=1
group by session.session_id, session.session_start_time, session.session_end_time, session.car_id
)

select s1.session_id as session_id, s1.car_id as car_id,
s2.session_end_time as idle_session_start,
s1.session_start_time as idle_session_end
from sessions s1
inner join sessions s2 on s1.car_id=s2.car_id and s2.rank=s1.rank-1
where s2.session_end_time<>s1.session_start_time
and s1.user_list<>s2.user_list

# models/schema.yml
version: 2

models:
  - name: idle_time
    columns:
      - name: session_id
        tests:
          - unique
          - not_null
      - name: car_id
      - name: idle_minutes

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.
idle_time.sql · 18 lines
source-preserved validation: parses
WITH sessions as(
SELECT session.session_id, session.car_id, session.session_start_time, session.session_end_time,
sum(IFNULL("user".usr_id,0)) as user_list,
rank() over (partition by session.car_id order by session.session_id) as rank
FROM unite_db_stage.session AS session
INNER JOIN unite_db_stage.usr_in_session AS user_in_session ON session.session_id=user_in_session.session_id
INNER JOIN unite_db_stage.usr AS "user" ON ("user".usr_id)=user_in_session.usr_id
where session_type=1
group by session.session_id, session.session_start_time, session.session_end_time, session.car_id
)

select s1.session_id as session_id, s1.car_id as car_id,
s2.session_end_time as idle_session_start,
s1.session_start_time as idle_session_end
from sessions s1
inner join sessions s2 on s1.car_id=s2.car_id and s2.rank=s1.rank-1
where s2.session_end_time<>s1.session_start_time
and s1.user_list<>s2.user_list
idle_time.view.lkml · 60 lines
inferred
view: idle_time {
  derived_table: {
    sql: WITH sessions as(
SELECT session.session_id, session.car_id, session.session_start_time, session.session_end_time,
sum(IFNULL("user".usr_id,0)) as user_list,
rank() over (partition by session.car_id order by session.session_id) as rank
FROM unite_db_stage.session AS session
INNER JOIN unite_db_stage.usr_in_session AS user_in_session ON session.session_id=user_in_session.session_id
INNER JOIN unite_db_stage.usr AS "user" ON ("user".usr_id)=user_in_session.usr_id
where session_type=1
group by session.session_id, session.session_start_time, session.session_end_time, session.car_id
)

select s1.session_id as session_id, s1.car_id as car_id,
s2.session_end_time as idle_session_start,
s1.session_start_time as idle_session_end
from sessions s1
inner join sessions s2 on s1.car_id=s2.car_id and s2.rank=s1.rank-1
where s2.session_end_time<>s1.session_start_time
and s1.user_list<>s2.user_list ;;
  }

  dimension: session_id {
    type: number
    primary_key: yes
    hidden: yes
    sql: ${TABLE}.session_id ;;
  }

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

  dimension: idle_minutes {
    sql: TIMESTAMPDIFF(SQL_TSI_MINUTE,${TABLE}.idle_session_start,${TABLE}.idle_session_end) ;;
  }

  dimension_group: idle_start {
    type: time
    timeframes: [time, date, week, month]
    sql: ${TABLE}.idle_session_start ;;
  }

  dimension_group: idle_end {
    type: time
    timeframes: [time, date, week, month]
    sql: ${TABLE}.idle_session_end ;;
  }

  measure: count {
    type: count
    drill_fields: [detail*]
  }

  measure: total_idle_minutes {
    type: sum
    sql: ${idle_minutes} ;;
  }
}
idle_time.view.lookml · 54 lines
source-preserved
- view: idle_time
  derived_table:
    sql: WITH sessions as(
SELECT session.session_id, session.car_id, session.session_start_time, session.session_end_time,
sum(IFNULL("user".usr_id,0)) as user_list,
rank() over (partition by session.car_id order by session.session_id) as rank
FROM unite_db_stage.session AS session
INNER JOIN unite_db_stage.usr_in_session AS user_in_session ON session.session_id=user_in_session.session_id
INNER JOIN unite_db_stage.usr AS "user" ON ("user".usr_id)=user_in_session.usr_id
where session_type=1
group by session.session_id, session.session_start_time, session.session_end_time, session.car_id
)

select s1.session_id as session_id, s1.car_id as car_id,
s2.session_end_time as idle_session_start,
s1.session_start_time as idle_session_end
from sessions s1
inner join sessions s2 on s1.car_id=s2.car_id and s2.rank=s1.rank-1
where s2.session_end_time<>s1.session_start_time
and s1.user_list<>s2.user_list
  fields:
  - dimension: session_id
    type: number
    primary_key: true
    hidden: true
    sql: ${TABLE}.session_id
  - dimension: car_id
    type: number
    sql: ${TABLE}.car_id
  - dimension: idle_minutes
    sql: TIMESTAMPDIFF(SQL_TSI_MINUTE,${TABLE}.idle_session_start,${TABLE}.idle_session_end)
  - dimension_group: idle_start
    type: time
    timeframes:
    - time
    - date
    - week
    - month
    sql: ${TABLE}.idle_session_start
  - dimension_group: idle_end
    type: time
    timeframes:
    - time
    - date
    - week
    - month
    sql: ${TABLE}.idle_session_end
  - measure: count
    type: count
    drill_fields:
    - detail*
  - measure: total_idle_minutes
    type: sum
    sql: ${idle_minutes}

Contents

  • idle_time.sql
  • idle_time.sql
  • idle_time.view.lkml
  • idle_time.view.lookml