-- ============================================================================
-- Free-form SQL Collaboration Demo: Data Consumer
-- ============================================================================
-- This example demonstrates joining a Snowflake Data Clean Rooms collaboration
-- as an analysis runner. The data consumer joins a collaboration created by
-- the data provider, views available templates and data offerings, runs an
-- analysis using the provider's template, and then runs several free-form SQL
-- queries directly against the data-offering views.
--
-- The data offering in this collaboration has three free-form SQL policies:
-- * Aggregation policy (hashed_email): minimum group size of 5.
-- * Join policy (hashed_email): joins must include this column. Currently inactive.
-- * Masking policy (income_bracket): values are replaced with '***MASKED***'.
--
-- For more information, see:
-- docs.snowflake.com/user-guide/cleanrooms/free-form-sql.rst
-- docs.snowflake.com/user-guide/cleanrooms/spec-reference
-- ============================================================================
-- ============================================================================
-- Join the collaboration
-- ============================================================================
USE ROLE SAMOOHA_APP_ROLE;
USE WAREHOUSE APP_WH;
-- You can't use secondary roles with most collaboration procedures.
USE SECONDARY ROLES NONE;
-- View available collaborations. Look for the collaboration created by the data provider.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.VIEW_COLLABORATIONS();
-- Use the SOURCE_NAME column value from the response to VIEW_COLLABORATIONS().
SET collaboration_name = 'freeform_sql_demo';
-- Use the OWNER_ACCOUNT column value from the response to VIEW_COLLABORATIONS().
SET collaborator_data_sharing_id = '<provider_data_sharing_id>';
-- Review the collaboration spec before joining.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.REVIEW($collaboration_name, $collaborator_data_sharing_id);
-- Join the collaboration. Joining is asynchronous; call GET_STATUS until JOINED.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.JOIN($collaboration_name);
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.GET_STATUS($collaboration_name);
-- ============================================================================
-- View available templates and data offerings
-- ============================================================================
-- View data offerings shared with you in this collaboration.
-- Set a variable to use in future queries.
-- Note that the view name used by templates != the view name used for free-form SQL queries.
-- Templates use the TEMPLATE_VIEW_NAME value.
-- Free-form queries use the FREEFORM_SQL_VIEW_NAME value.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.VIEW_DATA_OFFERINGS($collaboration_name);
SET template_view_name = '<template_view_name>';
SET freeform_view_name = '<freeform_view_name>';
-- View templates available to you in this collaboration.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.VIEW_TEMPLATES($collaboration_name);
-- ============================================================================
-- Run an analysis using the provider's template
-- ============================================================================
-- Replace the placeholders with the template name/version from VIEW_TEMPLATES
-- and the view name from VIEW_DATA_OFFERINGS.
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.RUN(
$collaboration_name,
$$
api_version: 2.0.0
spec_type: analysis
description: Count customers grouped by status.
template: '<status_summary_template_name_and_version>'
template_configuration:
view_mappings:
source_tables:
- '<template_view_name>'
$$
);
-- ============================================================================
-- Free-form SQL queries: Queries that SUCCEED
-- ============================================================================
-- The following queries run directly against the data-offering view.
-- Query 1: Count customers grouped by status.
-- Succeeds because the aggregation produces groups larger than 5.
SELECT status, COUNT(*) AS customer_count
FROM IDENTIFIER( $freeform_view_name ) AS t
GROUP BY status
ORDER BY customer_count DESC;
-- Query 2: Count customers grouped by age_band.
-- Succeeds because the aggregation produces groups larger than 5.
SELECT age_band, COUNT(*) AS customer_count
FROM IDENTIFIER( $freeform_view_name ) AS t
GROUP BY age_band
ORDER BY age_band;
-- Query 3: Select income_bracket to demonstrate the masking policy.
-- The query succeeds, but income_bracket values are replaced with '***MASKED***'
-- because the masking policy is applied to this column.
SELECT income_bracket, COUNT(*) AS customer_count
FROM IDENTIFIER( $freeform_view_name ) AS t
GROUP BY income_bracket;
-- Query 4: Combine masked and unmasked columns.
-- income_bracket is masked; status and age_band are not.
SELECT status, age_band, income_bracket, COUNT(*) AS customer_count
FROM IDENTIFIER( $freeform_view_name ) AS t
GROUP BY status, age_band, income_bracket
ORDER BY customer_count DESC;
-- Query 5: Group by a high-cardinality column.
-- Succeeds, but shows no values for hashed_email_b64_encoded because
-- grouping by hashed_email_b64_encoded produces groups of 1.
SELECT hashed_email_b64_encoded, COUNT(*) AS row_count
FROM IDENTIFIER( $freeform_view_name ) AS t
GROUP BY hashed_email_b64_encoded;
-- ============================================================================
-- Free-form SQL queries: Queries that FAIL
-- ============================================================================
-- Query 6: Select individual rows without aggregation.
-- FAILS because the aggregation policy requires a minimum group size of 5.
SELECT hashed_email_b64_encoded, status, age_band
FROM IDENTIFIER( $freeform_view_name ) AS t
LIMIT 10;
-- Query 8: Select a column not listed in the data offering.
-- FAILS because region_code is not included in schema_and_template_policies,
-- so it is not exposed in the data-offering view, although it is present in the source data.
SELECT region_code, COUNT(*) AS customer_count
FROM IDENTIFIER( $freeform_view_name ) AS t
GROUP BY region_code;
-- SWITCH TO provider account, update the JOIN policy, and re-run the successful
-- queries, which will now fail.