프로젝트에서 개발하는 동안 Explore 또는 LookML 검사기에 다음과 같은 오류가 표시될 수 있습니다.
Measures with Looker aggregations (sum, average, min, max, list types) may not reference other measures.
이 오류는 다음과 같이 LookML 정의에 있는 다른 집계 또는 다른 측정값을 참조하는 집계 측정으로 인해 발생합니다.
SELECT AVG((COUNT(*)) ) AS users.average_count FROM demo_db.users AS users
이러한 SQL 문은 SQL에서 이중 또는 중첩 집계를 생성합니다. 대부분의 SQL 언어는 집계를 이중 집계하거나 중첩 집계할 수 없으므로 이러한 시도로 인해 오류가 트리거됩니다.
솔루션
다음과 같은 두 가지 문제 해결 방법이 있습니다.
비집계 측정 사용
type: yesno 및 type: number와 같은 비집계 측정은 다른 측정 또는 집계를 참조할 수 있는 유일한 측정값입니다. 비집계 측정은 집계를 수행하지 않으므로 이중 또는 중첩 집계를 수행하지 않습니다. type: number 또는 type: yesno 측정값은 자리표시자 역할을 하므로 다른 측정 또는 측정값 조합을 참조할 수 있습니다.
예를 들어 type: number 측정은 측정값을 계산하고 숫자 또는 정수를 생성하는 유효한 SQL 표현식을 수행하는 데 사용됩니다.
다음 예시에서는 type: number를 사용하여 취소된 모든 주문의 비율을 계산합니다.
measure: order_count { # Base measure #1
type: count
sql: ${order_id} ;;
}
measure: cancelled_orders { # Base measure #2
type: count
filters: [status: "Cancelled"]
}
measure: percent_cancelled_orders { # New measure
type: number
sql: (1.0*${cancelled_orders})/ISNULL(${order_count},0) ;;
}
이중 또는 중첩 집계에 파생 테이블 사용
하지만 분석을 수행하는 데 중첩된 집계가 필요한 경우에는 어떻게 해야 할까요? 예를 들어 고객이 고객 평생 동안 지출한 평균 금액('평균 고객 평생 가치')을 알아야 하는 경우에는 어떻게 해야 하나요? 이를 위해서는 다음을 포함하여 두 가지 집계 수준(이중 또는 중첩)이 필요합니다.
-
고객별로 그룹화한 판매 합계
-
이 합계의 평균
이를 위해 LookML을 사용하려면 다음을 시도해 보세요.
measure: total_revenue {
type: sum
sql: ${sale_price} ;;
}
measure: avg_customer_lifetime_value {
type: average
sql: ${total_revenue} ;;
}
하지만 avg_customer_lifetime_value 측정이 이미 집계된 total_revenue 측정값에서 집계를 수행하므로 오류가 발생합니다. 앞에서 설명한 것처럼 대부분의 SQL 언어는 쿼리에 이중 또는 중첩 집계가 사용될 때 오류를 트리거합니다.
SQL에서 total_revenue 합계의 평균을 달성하기 위해서는 다음과 같은 서브 쿼리가 필요합니다.
SELECT AVG(s.sum) FROM (SELECT SUM(x) as sum FROM ...) AS s
Looker에서 동일한 솔루션은 total_lifetime_value 측정값을 집계 가능한 필드로 '평면화'하는 파생된 테이블을 만드는 것입니다. Looker에서는 이를 측정값 측정기준화라고 합니다. 파생된 테이블을 사용하면 total_lifetime_value 측정값이 측정기준이 됩니다. 그런 다음 customer_lifetime_value 측정기준을 참조하는 type: average 측정값을 만들 수 있습니다.
view: customer_facts {
derived_table: {
sql:
SELECT
user_id,
COALESCE(SUM(sale_price), 0) AS customer_lifetime_value
FROM orders
GROUP BY user_id;;
}
dimension: customer_lifetime_value {
type: number
sql: ${TABLE}."customer_lifetime_value" ;;
}
measure: average_customer_lifetime_value {
type: average
sql: ${customer_lifetime_value} ;;
}
}
customer_facts 파생 테이블이 Explore에 조인되면 average_customer_lifetime_value 측정값을 사용하여 오류 없이 트리거에서 원하는 분석을 수행할 수 있습니다.