사용자 지정 Clean Room 템플릿 만들기¶
Clean Room 템플릿 정보¶
Clean Room 템플릿은 JinjaSQL 로 작성되어 있습니다. JinjaSQL 은 SQL 쿼리를 출력으로 생성하는 Jinja 템플릿 언어의 확장 프로그램입니다. JinjaSQL 은 논리 문과 런타임 변수 확인을 지원하여 사용자가 런타임에 쿼리를 사용자 지정할 수 있습니다. 변수는 일반적으로 사용자가 쿼리에 사용할 테이블 이름, 테이블 열 및 사용자 지정 값을 지정할 수 있도록 템플릿에서 사용됩니다.
Snowflake는 일반적인 사용 사례를 위해 미리 디자인된 템플릿을 제공합니다. 이러한 기본 제공 템플릿은 웹 애플리케이션에서만 사용할 수 있습니다. 그러나 공급자와 컨슈머 모두 Clean Room을 위한 사용자 지정 템플릿을 만들 수 있습니다. 사용자 지정 템플릿은 코드로만 만들 수 있지만 코드 또는 웹 앱을 통해 실행할 수 있습니다.
템플릿에는 일반적으로 두 가지 유형이 있습니다.
SELECT 문(또는 SELECT 작업 세트)으로 평가하는 분석 템플릿.
CREATE TABLE 문 내부에 중첩된 SELECT 문으로 평가하고 테이블 이름을 반환하는 활성화 템플릿. 이 템플릿은 Clean Room이 구성된 방식에 따라 컨슈머 또는 공급자의 Snowflake 계정 또는 서드 파티로 내보내는 데이터를 생성합니다. 활성화 템플릿은 분석 템플릿과 매우 유사하며 몇 가지 추가 요구 사항이 있습니다.
Clean Rooms UI 에서 분석 템플릿을 활성화 템플릿과 연결하여 호출자가 분석을 실행한 다음 자신 또는 서드 파티에 데이터를 보낼 수 있도록 할 수 있습니다. 활성화 템플릿은 연결된 분석 템플릿과 동일한 쿼리로 해결할 필요가 없습니다.
사용자 지정 템플릿 만들기 및 실행하기¶
기본 설정이 있는 Clean Room에서는 공급자가 Clean Room에 템플릿을 추가하면 컨슈머가 이를 선택, 구성, 실행할 수 있습니다.
공급자 는 사용자 지정 템플릿을 디자인하고
provider.add_custom_sql_template
을 호출하여 Clean Room에 추가합니다.컨슈머 는
consumer.run_analysis
를 호출하여 공급자의 템플릿을 실행하고 템플릿에 필요한 변수에 대한 값을 전달합니다.
이 흐름에는 공급자가 컨슈머를 Clean Room에 초대해야 한다는 것 외에는 상대방의 권한이 필요하지 않습니다. 이 프로세스에는 컨슈머가 제공하는 템플릿과 공급자 실행 템플릿 등 다양한 변형이 있으며, 이에 관해서는 다른 곳에서 다룹니다.
데이터 보호¶
템플릿은 공급자와 컨슈머가 Clean Room에 연결한 데이터 세트에만 액세스할 수 있습니다.
공급자와 컨슈머 모두 데이터에 대한 조인, 열 및 활성화 정책을 설정하여 조인할 수 있는 열을 보호하고, 활성화된 결과 세트에 투영하거나 투영할 수 있는 열을 보호할 수 있는 기능이 있습니다.
간단한 예¶
다음은 이메일을 통해 공급자와 컨슈머 테이블을 조인하고 도시별 중복 수를 보여주는 간단한 SQL 예제입니다.
SELECT COUNT(*), city FROM consumer_table
INNER JOIN provider_table
ON consumer_table.hashed_email = provider_table.hashed_email
GROUP BY city;
다음은 호출자가 선택/그룹화 및 조인 열과 테이블을 선택할 수 있는 템플릿으로 쿼리가 표시되는 모습입니다.
SELECT COUNT(*), IDENTIFIER({{ group_by_col | column_policy }})
FROM IDENTIFIER({{ my_table[0] }}) AS C
INNER JOIN IDENTIFIER({{ source_table[0] }}) AS P
ON IDENTIFIER({{ consumer_join_col | join_policy }}) = IDENTIFIER({{ provider_join_col | join_policy }})
GROUP BY IDENTIFIER({{ group_by_col | column_policy }});
템플릿에 대한 참고 사항:
{{ double bracket pairs }} 내의 값은 사용자 지정 변수입니다.
group_by_col
,my_table
,source_table
,consumer_join_col
,provider_join_col
,group_by_col
은 모두 호출자에 의해 채워지는 사용자 지정 변수입니다.source_table
과my_table
은 호출자에 의해 채워지는 Snowflake 정의 문자열 배열 변수입니다. 배열 멤버는 Clean Room에 연결된 공급자 및 컨슈머 테이블의 정규화된 이름입니다. 호출자는 각 배열에 포함할 테이블을 지정합니다.템플릿에서 공급자 테이블은
P
, 컨슈머 테이블은C
로 별칭을 지정해야 합니다. 테이블이 여러 개 있는 경우P1
,P2
,C1
,C2
등으로 인덱싱할 수 있습니다.{{ double brackets }} 의 변수는 유효한 식별자가 아닌 문자열 리터럴로 평가되므로 모든 열 및 테이블 이름에 IDENTIFIER 가 필요합니다.
JinjaSQL 필터 를 변수에 적용할 수 있습니다. Snowflake는 각각 Clean Room에서 열이 조인 또는 열 정책을 준수하는지 여부를 확인하고 준수하지 않는 경우 쿼리를 실패시키는 사용자 지정 필터
join_policy
및column_policy
를 구현합니다. 필터가 열 이름에{{ column_name | filter_name }}
으로 적용됩니다.
이 모든 사항은 나중에 자세히 설명하겠습니다.
컨슈머가 이 템플릿을 코드에서 실행하는 방법은 다음과 같습니다. 템플릿에 선언된 테이블 별칭으로 열 이름이 한정되는 방식에 유의하십시오.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.CONSUMER.RUN_ANALYSIS(
$cleanroom_name,
$template_name,
['my_db.my_sch.consumer_table], -- Populates the my_table variable
['my_db.my_sch.provider_table'], -- Populates the source_table variable
OBJECT_CONSTRUCT( -- Populates custom named variables
'consumer_join_col','c.age_band',
'provider_join_col','p.age_band',
'group_by_col','p.device_type'
)
);
웹 애플리케이션에서 이 템플릿을 사용하려면 공급자가 템플릿에 대한 사용자 지정 UI 양식을 만들어야 합니다. UI 양식에는 템플릿 변수 이름에 해당하는 양식 요소가 명명되어 있으며 양식에 제공된 값은 템플릿으로 전달됩니다.
팁
개발 초기에는 consumer.get_sql_jinja 프로시저를 사용하여 템플릿이 렌더링될 때 어떻게 보이는지 확인할 수 있습니다. 하지만 이 프로시저는 join_policy
와 같은 Clean Room 필터 확장 프로그램을 지원하지 않으므로 해당 프로시저로 전송되는 모든 템플릿에서 이러한 필터를 생략해야 합니다.
사용자 지정 템플릿 구문¶
Snowflake Data Clean Rooms는 V3 JinjaSQL 을 지원하며, 몇 가지 확장 프로그램이 있습니다.
이 섹션에는 다음 항목이 포함되어 있습니다.
템플릿 명명 규칙¶
템플릿을 만들 때 이름은 모두 소문자, 숫자, 공백 또는 밑줄을 사용해야 합니다. 활성화 템플릿(컨슈머 실행 공급자 활성화는 예외)의 이름은 “activation”으로 시작해야 합니다. 템플릿 이름은 provider.add_custom_sql_template
또는 consumer.create_template_request
를 호출할 때 지정됩니다.
유효한 이름의 예:
my_template
activation_template_1
유효하지 않은 이름의 예:
my template
- 허용되지 않는 공백My_Template
- 소문자 템플릿만 허용됨
템플릿 변수¶
템플릿 호출자는 템플릿 변수에 값을 전달할 수 있습니다. JinjaSQL 구문을 사용하면 {{ double_brackets }} 내의 모든 변수 이름에 대해 변수 바인딩을 사용할 수 있지만, 아래에 설명된 대로 재정의해서는 안 되는 몇 가지 변수 이름이 Snowflake에 예약되어 있습니다.
조심
모든 변수는 Snowflake 정의이든 사용자 지정이든 사용자가 채우므로 적절한 주의를 기울여 다루어야 합니다. Snowflake Data Clean Rooms 템플릿은 단일 SELECT 문으로 해결되어야 하지만 모든 변수는 호출자가 전달한다는 점을 기억해야 합니다.
Snowflake 정의 변수¶
모든 Clean Room 템플릿은 Snowflake에 의해 정의되지만 호출자가 전달한 다음 전역 변수에 액세스할 수 있습니다.
source_table
:템플릿에서 사용할 수 있는 Clean Room의 공급자 연결된 테이블 및 뷰의 제로 기반 문자열 배열입니다. 테이블 이름은 정규화된 이름으로,
my_db.my_sch.provider_customers
를 예로 들 수 있습니다.예:
SELECT col1 FROM IDENTIFIER({{ source_table[0] }}) AS p;
my_table
:템플릿에서 사용할 수 있는 Clean Room의 컨슈머 테이블 및 뷰의 제로 기반 문자열 배열입니다. 테이블 이름은 정규화된 이름으로,
my_db.my_sch.consumer_customers
를 예로 들 수 있습니다.예:
SELECT col1 FROM IDENTIFIER({{ my_table[0] }}) AS c;
privacy
:사용자 및 템플릿과 관련된 개인정보 관련 값의 세트입니다. 사용 가능한 하위 필드 목록을 참조하십시오. 이러한 값은 사용자에 대해 명시적으로 설정 할 수 있지만, 설정하지 않은 경우 템플릿에서 항상 기본값을 제공해야 합니다. 템플릿에서 직접 하위 필드에 액세스합니다(예:
privacy.threshold
).예: 다음은
threshold_value
를 사용하여 집계 절에 최소 그룹 크기를 적용하는 템플릿의 예시 코드 조각입니다.SELECT IFF(a.overlap > ( {{ privacy.threshold_value | default(2) | sqlsafe }} ), a.overlap,1 ) AS overlap, c.total_count AS total_count ...
참고
레거시 Clean Room 전역 변수는 measure_columns
및 dimensions
의 두 가지가 있습니다. 더 이상 권장되지 않지만 여전히 정의되어 있고 일부 레거시 템플릿 및 설명서에 표시되므로 이름 충돌을 피하기 위해 이러한 이름을 사용하여 테이블이나 열의 별칭을 지정하지 않아야 합니다.
사용자 지정 변수¶
템플릿 작성자는 호출자가 채울 수 있는 임의의 변수를 템플릿에 포함할 수 있습니다. 이러한 변수는 Snowflake 정의 변수나 테이블 별칭 이름을 제외하고는 임의의 Jinja 호환 이름을 가질 수 있습니다. 웹 애플리케이션에서 템플릿을 사용할 수 있도록 하려면 웹 앱 사용자를 위한 UI 양식도 제공해야 합니다. API 사용자의 경우 필수 변수와 선택적 변수에 대한 설명서를 제공해야 합니다.
사용자 지정 변수는 템플릿에서 액세스할 수 있습니다(예: 사용자 지정 변수 max_income
).
SELECT income FROM my_db.my_sch.customers WHERE income < {{ max_income }};
사용자는 두 가지 방법으로 템플릿에 변수를 전달할 수 있습니다.
웹 앱에서는 템플릿 개발자가 만든 UI 양식을 통해 값을 선택하거나 공급할 수 있습니다. 이 UI 양식에는 사용자가 템플릿에 대한 값을 제공할 수 있는 양식 요소가 포함되어 있습니다. 양식 요소의 이름은 변수의 이름입니다. 템플릿은 단순히 양식 요소의 이름을 사용하여 값에 액세스합니다. 공급자.추가_ui_양식_사용자 지정 을 사용하여 UI 양식을 만듭니다.
코드에서 컨슈머가 consumer.run_analysis 를 호출하고 테이블 이름을 인자 배열로, 사용자 지정 변수를 이름-값 페어로
analysis_arguments
인자에 전달합니다.
참고
Clean Room에 업로드된 사용자 지정 Python 코드에서 사용자가 제공한 값에 액세스해야 하는 경우, Python 함수 인자를 통해 명시적으로 변수 값을 코드에 전달 해야 하며, 템플릿 변수는 {{jinja variable binding syntax}}
를 사용하여 Python 코드 내에서 직접 액세스할 수 없습니다.
변수를 올바르게 해결하기¶
템플릿에 전달된 문자열 값은 최종 템플릿에서 문자열 리터럴로 해석됩니다. 바인딩된 변수를 적절하게 처리하지 않으면 SQL 구문 분석 또는 논리적 오류가 발생할 수 있습니다.
SELECT {{ my_col }} FROM P;
는SELECT 'my_col' from P;
로 확인되는데, 이는 단순히 “my_col”이라는 문자열을 반환하므로 원하는 것과는 다를 수 있습니다.SELECT age FROM {{ my_table[0] }} AS P;
는SELECT age FROM 'somedb.somesch.my_table' AS P;
로 확인되며, 테이블은 리터럴 문자열이 아닌 식별자이어야 하므로 구문 분석 오류가 발생합니다.SELECT age FROM IDENTIFIER({{ my_table[0] }}) AS P {{ where_clause }};
이 “WHERE age < 50”을 전달하면SELECT age FROM mytable AS P 'WHERE age < 50';
이 되는데, 이는 리터럴 문자열 WHERE 절 때문에 구문 분석 오류입니다.
따라서 적절한 경우 변수를 해결해야 합니다. 템플릿에서 변수를 올바르게 해결하는 방법은 다음과 같습니다.
- 테이블 및 열 이름
테이블 또는 열 이름을 지정하는 변수는 템플릿에서 두 가지 방법 중 하나를 사용하여 식별자로 변환해야 합니다.
IDENTIFIER: 예:
SELECT IDENTIFIER({{ my_column }}) FROM P;
sqlsafe: 이 JinjaSQL 필터는 식별자 문자열을 SQL 텍스트로 변환합니다. 이전 글머리 기호에 해당하는 문은
SELECT {{ my_column | sqlsafe }} FROM P;
입니다.
특정 사용법에 따라 IDENTIFIER 또는
sqlsafe
를 사용해야 하는 시기가 결정됩니다. 예를 들어c.{{ my_column | sqlsafe }}
는 IDENTIFIER 를 사용하여 쉽게 다시 작성할 수 없습니다.- 동적 SQL
WHERE 절과 같이 리터럴 SQL 로 사용해야 하는 문자열 변수가 있는 경우 템플릿에서
sqlsafe
필터를 사용하십시오. 예:SELECT age FROM IDENTIFIER({{ my_table[0] }}) AS C WHERE {{ where_clause }};
사용자가 “age < 50”을
where_clause
에 전달하면 쿼리는 리터럴 문자열 WHERE 조건 때문에 유효하지 않은 SQL 인SELECT age FROM sometable AS C WHERE 'age < 50';
으로 확인됩니다. 이 경우sqlsafe
필터를 사용해야 합니다.SELECT age FROM IDENTIFIER( {{ my_table[0] }} ) as C {{ where_clause | sqlsafe }};
필수 테이블 별칭¶
쿼리의 최상위 수준에서 모든 테이블 또는 하위 쿼리의 별칭을 P
(공급자 테이블의 경우) 또는 C
(컨슈머 테이블의 경우)로 지정해야 Snowflake가 쿼리에서 조인 및 열 정책의 유효성을 올바르게 검사할 수 있습니다. 조인 또는 열 정책에 대해 확인해야 하는 모든 열은 P
또는 C
로 별칭이 지정된 테이블에 속합니다. (P
또는 C
를 지정하면 백엔드에 각각 공급자 또는 컨슈머 정책에 대해 열의 유효성을 검사할지 여부를 알려줍니다.)
쿼리에 여러 공급자 또는 컨슈머 테이블을 사용하는 경우 첫 번째 테이블 별칭 뒤에 숫자 1을 기준으로 순차적으로 접미사를 추가합니다. 그래서 첫 번째, 두 번째, 세 번째 공급자 테이블의 경우 P
, P1
, P2
등이고 첫 번째, 두 번째, 세 번째 컨슈머 테이블의 경우 C
, C1
, C2
등이 됩니다. P
또는 C
인덱스는 간격 없이 순차적이어야 합니다(즉, P
, P2
, P4
가 아닌 P
, P1
, P2
라는 별칭을 생성해야 함).
예
SELECT col1 FROM IDENTIFIER({{ source_table[0] }}) AS P;
템플릿 필터¶
Snowflake는 모든 표준 Jinja 필터 및 대부분의 표준 JinjaSQL 필터 를 몇 가지 확장 프로그램과 함께 지원합니다.
join_policy
: 테이블의 조인 정책에서 열이 허용되는지 확인하고 허용되지 않으면 실패합니다.column_policy
: 템플릿의 열 정책에 따라 열이 허용되는지 확인합니다(투영이 허용됨).activation_policy
: 필터링된 열이 Clean Room의 활성화 정책(provider.set_activation_policy
또는consumer.set_activation_policy
)에 의해 허용되는지 확인합니다.join_and_column_policy
: 조인, 활성화 또는 열 정책에 의해 열이 허용되는지 여부를 확인합니다. 공동 작업자가 템플릿을 변경하지 않고도 조인 및 열 정책을 업데이트할 수 있도록 Clean Room에서 더 많은 유연성을 제공하는 데 사용됩니다.Snowflake 템플릿에서는
identifier
JinjaSQL 필터가 지원되지 않습니다.
JinjaSQL 필터를 왼쪽에서 오른쪽으로 분석합니다.
{{ my_col | column_policy }}
정답{{ my_col | sqlsafe | column_policy }}
정답{{ column_policy | my_col }}
오답{{ my_col | column_policy | sqlsafe }}
오답
Clean Room 정책 적용하기¶
Clean Rooms는 템플릿에 사용된 열에 대해 Clean Room 정책을 자동으로 확인하지 않습니다. 열에 대해 정책을 적용하려면 템플릿의 해당 열에 적절한 정책 필터 를 적용해야 합니다. 예:
JOIN IDENTIFIER({{ source_table[0] }}) AS p
ON {{ c_join_col | sqlsafe | join_policy }} = {{ p_join_col | sqlsafe }}
이렇게 하면 c_join_col
에 전달된 열에 대해 조인 정책을 테스트하지만 p_join_col
에 대해서는 테스트하지 않습니다.
정책을 테스트할 때는 다른 SQL 사용법과 마찬가지로 열 이름이 모호해서는 안 된다는 점에 유의하십시오. 따라서 두 테이블에 같은 이름의 열이 있는 경우 해당 열에 대해 정책을 테스트하려면 열 이름을 한정해야 합니다.
사용자 지정 Python 코드 실행하기¶
템플릿은 Clean Room에 업로드된 Python 코드를 실행할 수 있습니다. 템플릿은 데이터 행에서 값을 받아 쿼리에서 사용하거나 투영할 값을 반환하는 Python 함수를 호출할 수 있습니다.
공급자 가 사용자 지정 Python 코드를 Clean Room에 업로드하면 템플릿은
cleanroom.function_name
구문으로 Python 함수를 호출합니다. 자세한 내용은 여기를 참조하십시오.컨슈머 가 사용자 지정 Python 코드를 Clean Room에 업로드하면 템플릿은 순수한
function_name
값을consumer.generate_python_request_template
에 전달하여 함수를 호출합니다(공급자 코드처럼Clean Room
에 대한 범위가 지정되지 않음). 자세한 내용은 여기를 참조하십시오.
공급자 코드 예시:
-- Provider uploads a Python function that takes two numbers and returns the sum.
call samooha_by_snowflake_local_db.provider.load_python_into_cleanroom(
$cleanroom_name,
'simple_addition', -- Function name to use in the template
['someval integer', 'added_val integer'], -- Arguments
[], -- No packages needed
'integer', -- Return type
'main', -- Handler for function name
$$
def main(input, added_val):
return input + int(added_val)
$$
);
-- Template passes value from each row to the function, along with a
-- caller-supplied argument named 'increment'
call samooha_by_snowflake_local_db.provider.add_custom_sql_template(
$cleanroom_name,
'simple_python_example',
$$
SELECT val, cleanroom.simple_addition(val, {{ increment | sqlsafe }})
FROM VALUES (5),(8),(12),(39) AS P(val);
$$
);
보안 고려 사항¶
템플릿은 Clean Room 네이티브 애플리케이션에서 실행되는 단일 SELECT 쿼리로 평가되어야 합니다. 템플릿은 현재 사용자의 ID로 실행되지 않습니다.
사용자는 Clean Room 내의 데이터에 직접 액세스할 수 없으며, 모든 액세스는 템플릿 결과를 통해 기본 애플리케이션을 통해 이루어집니다.
열 이름을 템플릿에 명시적으로 정의하거나 열 또는 테이블을 제공한 경우에도 쿼리에서 열이 사용될 때마다 정책 필터를 적용하십시오. 나중에 조인 또는 열 정책을 변경하거나 열을 변경하고 템플릿을 업데이트하는 것을 잊을 수 있습니다. 사용자가 제공한 모든 열에 대해 join_policy
, column_policy
, join_and_column_policy
또는 activation_policy
필터를 적용해야 합니다.
활성화 템플릿¶
템플릿을 사용하여 쿼리 결과를 Clean Room 외부의 테이블에 저장할 수도 있습니다. 이를 활성화 라고 합니다. 현재 사용자 지정 템플릿에 지원되는 유일한 활성화 형태는 공급자 활성화와 컨슈머 활성화(각각 공급자 또는 컨슈머의 Snowflake 계정에 결과 저장)입니다. 활성화를 구현하는 방법에 대해 알아보십시오.
활성화 템플릿은 다음과 같은 추가 요구 사항이 있는 분석 템플릿입니다.
활성화 템플릿은 단순한 SELECT 문일 수 있는 분석 템플릿과 달리 SQL 스크립트 블록으로 평가되는 JinjaSQL 문입니다.
활성화 템플릿 의 이름은 문자열
activation
으로 시작해야 합니다(컨슈머 실행 공급자 활성화 템플릿은 예외). 예를 들어activation_my_template
과 같습니다.활성화 템플릿은 활성화하는 활성화 종류에 따라 종속성이 있는 이름으로 테이블 을 만들어야 합니다.
공급자 실행 공급자 활성화: 생성된 테이블 이름은
cleanroom.temp_result_data
여야 합니다.다른 모든 활성화 유형: 생성된 테이블 이름 앞에
cleanroom.activation_data_
를 접두사로 붙여야 합니다(예:cleanroom.activation_data_cross_activation_results
). 테이블 이름은 Clean Room 내에서 고유해야 합니다.
이 생성된 테이블은 중간 테이블이므로 직접 액세스하려고 하면 안 됩니다.
스크립트 블록은
cleanroom.
또는cleanroom.activation_data_
접두사를 제외한 생성된 테이블의 이름을 반환하는 RETURN 문으로 끝나야 합니다.활성화되는 모든 열은 데이터를 연결한 공급자 또는 컨슈머의 활성화 정책 에 나열되어야 하며,
activation_policy
필터가 적용되어 있어야 합니다. 열은 활성화 열과 조인 열이 모두 될 수 있습니다.템플릿을 Clean Rooms UI 에서 실행하려면
activation_template_name
및enabled_activations
필드가 포함된 웹 양식을 제공 해야 합니다. UI 에서 사용할 템플릿에는 분석 템플릿과 연결된 활성화 템플릿이 모두 있어야 합니다.테이블이 생성되고 있으므로 계산된 모든 열은 추론된 이름이 아닌 명시적으로 별칭을 지정해야 합니다. 즉,
COUNT 열 이름이 유추되므로
SELECT COUNT(*), P.status from T AS P;
FAILS 입니다.COUNT 열에 대한 별칭을 명시적으로 지정하므로
SELECT COUNT(*) AS COUNT_OF_ITEMS, P.status from T AS P;
SUCCEEDS 입니다.
다음은 두 가지 샘플 기본 활성화 템플릿입니다. 하나는 공급자 실행 서버 활성화용이고 다른 하나는 기타 활성화 유형용입니다. 결과 테이블 이름이 포함된 강조 표시된 두 줄이 다릅니다.
-- These are the required table name strings.
BEGIN
CREATE OR REPLACE TABLE cleanroom.temp_result_data AS
SELECT COUNT(c.status) AS ITEM_COUNT, c.status, c.age_band
FROM IDENTIFIER({{ my_table[0] }}) AS c
JOIN IDENTIFIER({{ source_table[0] }}) AS p
ON {{ c_join_col | sqlsafe | activation_policy }} = {{ p_join_col | sqlsafe | activation_policy }}
GROUP BY c.status, c.age_band
ORDER BY c.age_band;
RETURN 'temp_result_data';
END;
-- analysis_results can be whatever name you want.
BEGIN
CREATE OR REPLACE TABLE cleanroom.activation_data_analysis_results AS
SELECT COUNT(c.status) AS ITEM_COUNT, c.status, c.age_band
FROM IDENTIFIER({{ my_table[0] }}) AS c
JOIN IDENTIFIER({{ source_table[0] }}) AS p
ON {{ c_join_col | sqlsafe | activation_policy }} = {{ p_join_col | sqlsafe | activation_policy }}
GROUP BY c.status, c.age_band
ORDER BY c.age_band;
RETURN 'analysis_results';
END;
다음 단계¶
템플릿 시스템을 마스터한 후에는 템플릿 유형으로 Clean Room을 구현하기 위한 세부 사항을 읽어보십시오.
공급자 템플릿 은 공급자가 작성한 템플릿입니다. 이것이 기본 사용 사례입니다.
컨슈머 템플릿 은 컨슈머가 직접 작성한 템플릿입니다. 경우에 따라 Clean Room 작성자는 컨슈머가 직접 템플릿을 만들어 Clean Room에 업로드하고 실행할 수 있도록 하려고 합니다.
활성화 템플릿 은 실행 성공 후 결과 테이블을 생성합니다. 활성화 템플릿에 따라 결과 테이블을 Clean Room 외부의 공급자 또는 컨슈머의 계정에 저장하거나 활성화 허브에 나열된 서드 파티 활성화 공급자로 보낼 수 있습니다.
체인 템플릿 을 사용하면 여러 템플릿을 체인으로 연결하여 각 템플릿의 출력을 체인의 다음 템플릿에서 사용할 수 있습니다.