├── models └── air_quality.model.lkml └── views ├── 02_AQI_Measurement_Devices.view.lkml └── 01_air_quality_facts.view.lkml /models/air_quality.model.lkml: -------------------------------------------------------------------------------- 1 | connection: "snowlooker" 2 | 3 | # include all the views 4 | include: "/views/**/*.view" 5 | 6 | datagroup: air_quality_default_datagroup { 7 | sql_trigger: SELECT max(completed_at) FROM ecomm.etl_jobs;; 8 | max_cache_age: "1 hour" 9 | } 10 | 11 | persist_with: air_quality_default_datagroup 12 | 13 | explore: order_items { 14 | # access_filter:{ 15 | # field: products.brand 16 | # user_attribute: brand 17 | # } 18 | label: "(1) Air Quality Monitoring" 19 | view_name: air_quality_facts 20 | join: AQI_Measurement_Devices { 21 | relationship: many_to_one 22 | sql_on: ${air_quality_facts.user_id} = ${AQI_Measurement_Devices.id} ;; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /views/02_AQI_Measurement_Devices.view.lkml: -------------------------------------------------------------------------------- 1 | view: AQI_Measurement_Devices { 2 | sql_table_name: PUBLIC.USERS ;; 3 | 4 | dimension: id { 5 | primary_key: yes 6 | type: number 7 | sql: ${TABLE}.id ;; 8 | tags: ["user_id"] 9 | } 10 | 11 | dimension: first_name { 12 | hidden: yes 13 | sql: INITCAP(${TABLE}.first_name) ;; 14 | } 15 | 16 | dimension: last_name { 17 | hidden: yes 18 | sql: INITCAP(${TABLE}.last_name) ;; 19 | } 20 | 21 | dimension: name { 22 | label: "Device Manager Name" 23 | sql: ${first_name} || ' ' || ${last_name} ;; 24 | } 25 | drill_fields: [detail*] 26 | 27 | dimension: email { 28 | sql: ${TABLE}.email ;; 29 | tags: ["email"] 30 | 31 | action: { 32 | label: "Email Device Manager" 33 | url: "https://desolate-refuge-53336.herokuapp.com/posts" 34 | icon_url: "https://sendgrid.com/favicon.ico" 35 | param: { 36 | name: "some_auth_code" 37 | value: "abc123456" 38 | } 39 | form_param: { 40 | name: "Subject" 41 | required: yes 42 | default: "Question About Your AQI Device" 43 | } 44 | form_param: { 45 | name: "Body" 46 | type: textarea 47 | required: yes 48 | default: 49 | "Hi {{ AQI_Measurement_Devices.first_name._value }}, 50 | 51 | I've been noticing some unusual readings from your AQI device. 52 | Have you been experiencing any technical issues recently? 53 | 54 | Thanks! 55 | SMC Labs" 56 | } 57 | } 58 | required_fields: [name, first_name] 59 | } 60 | 61 | ## Demographics ## 62 | 63 | dimension: city { 64 | sql: ${TABLE}.city ;; 65 | drill_fields: [detail*] } 66 | 67 | dimension: state { 68 | sql: ${TABLE}.state ;; 69 | map_layer_name: us_states 70 | drill_fields: [detail*] } 71 | 72 | dimension: zip { 73 | type: zipcode 74 | sql: ${TABLE}.zip ;; 75 | drill_fields: [detail*] 76 | } 77 | 78 | dimension: country { 79 | map_layer_name: countries 80 | sql: CASE WHEN ${TABLE}.country = 'UK' THEN 'United Kingdom' 81 | ELSE ${TABLE}.country 82 | END 83 | ;; 84 | drill_fields: [detail*] 85 | } 86 | 87 | dimension: latitude { 88 | sql: ${TABLE}.latitude ;; 89 | hidden: yes 90 | } 91 | 92 | dimension: longitude { 93 | sql: ${TABLE}.longitude ;; 94 | hidden: yes 95 | } 96 | 97 | dimension: location { 98 | hidden: yes 99 | type: location 100 | sql_latitude: ${TABLE}.latitude ;; 101 | sql_longitude: ${TABLE}.longitude ;; 102 | } 103 | 104 | dimension: approx_latitude { 105 | type: number 106 | sql: round(${TABLE}.latitude,1) ;; 107 | hidden: yes 108 | } 109 | 110 | dimension: approx_longitude { 111 | type: number 112 | sql: round(${TABLE}.longitude,1) ;; 113 | hidden: yes 114 | } 115 | 116 | set: detail { 117 | fields: [air_quality_facts.created_date, AQI_Measurement_Devices.state, AQI_Measurement_Devices.city, air_quality_facts.device_id, air_quality_facts.air_quality_level, air_quality_facts.Daily_Air_Quality_Index, AQI_Measurement_Devices.name,AQI_Measurement_Devices.email] 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /views/01_air_quality_facts.view.lkml: -------------------------------------------------------------------------------- 1 | view: air_quality_facts { 2 | sql_table_name: PUBLIC.ORDER_ITEMS ;; 3 | 4 | dimension: device_id { 5 | primary_key: yes 6 | type: number 7 | sql: ${TABLE}.id ;; 8 | drill_fields: [detail*] 9 | } 10 | 11 | dimension: user_id { 12 | type: number 13 | hidden: yes 14 | sql: ${TABLE}.user_id ;; 15 | } 16 | 17 | measure: count { 18 | type: count_distinct 19 | sql: ${device_id} ;; 20 | drill_fields: [detail*] 21 | } 22 | 23 | dimension_group: created { 24 | type: time 25 | timeframes: [time, hour, date, week, month, year, hour_of_day, day_of_week, month_num, month_name, raw, week_of_year] 26 | sql: ${TABLE}.created_at ;; 27 | drill_fields: [detail*] 28 | } 29 | 30 | 31 | dimension: Daily_Air_Quality_Index { 32 | label: "Daily Air Quality Index" 33 | type: number 34 | value_format_name: decimal_2 35 | sql: ${TABLE}.sale_price ;; 36 | drill_fields: [detail*] 37 | } 38 | 39 | dimension: air_quality_level { 40 | order_by_field: air_quality_sort 41 | sql: CASE WHEN ${Daily_Air_Quality_Index} > 300 then 'Hazardous' 42 | WHEN ${Daily_Air_Quality_Index} > 200 then 'Very Unhealthy' 43 | WHEN ${Daily_Air_Quality_Index} > 150 then 'Unhealthy' 44 | WHEN ${Daily_Air_Quality_Index} > 100 then 'Unhealthy for Sensitive Groups' 45 | WHEN ${Daily_Air_Quality_Index} > 50 then 'Moderate' 46 | ELSE 'Good' END;; 47 | drill_fields: [detail*] 48 | link: { 49 | label: "{{value}} Detail Dashboard" 50 | url: "/dashboards/668?AQI%20Level={{ value | encode_uri }}" 51 | icon_url: "http://www.looker.com/favicon.ico" 52 | } 53 | 54 | html: {% if air_quality_facts.air_quality_level._value == 'Hazardous' %} 55 |
{{ value }}
56 | {% elsif air_quality_facts.air_quality_level._value == 'Very Unhealthy' %} 57 |{{ value }}
58 | {% elsif air_quality_facts.air_quality_level._value == 'Unhealthy' %} 59 |{{ value }}
60 | {% elsif air_quality_facts.air_quality_level._value == 'Unhealthy for Sensitive Groups' %} 61 |{{ value }}
62 | {% elsif air_quality_facts.air_quality_level._value == 'Moderate' %} 63 |{{ value }}
64 | {% elsif air_quality_facts.air_quality_level._value == 'Good' %} 65 |{{ value }}
66 | {% endif %};; 67 | 68 | } 69 | 70 | dimension: air_quality_sort { 71 | hidden: yes 72 | sql: CASE WHEN ${air_quality_level} = 'Good' THEN 1 73 | WHEN ${air_quality_level} = 'Moderate' THEN 2 74 | WHEN ${air_quality_level} = 'Unhealthy for Sensitive Groups' THEN 3 75 | WHEN ${air_quality_level} = 'Unhealthy' THEN 4 76 | WHEN ${air_quality_level} = 'Very Healthy' THEN 5 77 | WHEN ${air_quality_level} = 'Hazardous' THEN 6 78 | ELSE 7 END;; 79 | } 80 | 81 | measure: average_aqi { 82 | label: "Average AQI" 83 | type: average 84 | value_format_name: decimal_2 85 | sql: ${Daily_Air_Quality_Index} ;; 86 | drill_fields: [detail*] 87 | } 88 | 89 | measure: percent_of_total { 90 | label: "% of Total Days" 91 | sql: CASE WHEN ${air_quality_level} = 'Good' THEN '65.6' 92 | WHEN ${air_quality_level} = 'Moderate' THEN '29' 93 | WHEN ${air_quality_level} = 'Unhealthy for Sensitive Groups' THEN '3.5' 94 | WHEN ${air_quality_level} = 'Unhealthy' THEN '.9' 95 | WHEN ${air_quality_level} = 'Very Healthy' THEN '.6' 96 | WHEN ${air_quality_level} = 'Hazardous' THEN '.4' 97 | ELSE 7 END ;; 98 | value_format_name: percent_1 99 | } 100 | 101 | 102 | set: detail { 103 | fields: [created_date, AQI_Measurement_Devices.state, AQI_Measurement_Devices.city, device_id, air_quality_level, Daily_Air_Quality_Index, AQI_Measurement_Devices.name,AQI_Measurement_Devices.email] 104 | } 105 | } 106 | --------------------------------------------------------------------------------