CertSafari

    Free Snowflake SnowPro Advanced: Data Analyst (DAA-C01) Sample Questions

    35 free sample questions from our bank of 360+, covering every exam domain, with answers and detailed explanations. Updated October 2026.

    Domain 1: Data Ingestion and Data Preparation

    Subdomain 1.1: Use a collection system to retrieve data.

    1.An analyst loads XML documents into a `VARIANT` column named `doc` and needs to pull out the child element `<customer>` from each record. Which function retrieves a child element of an XML value by its tag name?

    1. A.`PARSE_XML`
    2. B.`XMLGET`
    3. C.`CHECK_XML`
    4. D.`STRIP_NULL_VALUE`
    Show answer & explanation

    Correct answer: B — `XMLGET`

    • A. `PARSE_XML` converts a string into an XML-typed VARIANT. It does not pick a child element from a value that is already parsed.
    • B. `XMLGET` returns the child element with the given tag name from an XML value, for example `XMLGET(doc, 'customer')`, and reads the content with `:"$"`.
    • C. `CHECK_XML` only validates whether text is well-formed XML and returns an error message or NULL, so it extracts nothing.
    • D. `STRIP_NULL_VALUE` converts JSON null in a VARIANT to SQL NULL and has no concept of XML tags.

    Subdomain 1.1: Use a collection system to retrieve data.

    2.The QA team needs 5 million rows of fake orders in a test table, each with a unique sequential `order_id` and an `amount` that varies randomly between 10 and 500 on every row. Which query generates this data inside Snowflake?

    1. A.SELECT SEQ4() AS order_id, UNIFORM(10, 500, RANDOM()) AS amount FROM TABLE(GENERATOR(ROWCOUNT => 5000000));
    2. B.SELECT SEQ4() AS order_id, RANDOM(10, 500) AS amount FROM TABLE(GENERATOR(ROWCOUNT => 5000000)) ORDER BY 1;
    3. C.SELECT SEQ4() AS order_id, UNIFORM(10, 500, 42) AS amount FROM TABLE(GENERATOR(ROWCOUNT => 5000000)) ORDER BY 1;
    4. D.SELECT SEQ4() AS order_id, UNIFORM(10, 500, RANDOM()) AS amount FROM GENERATOR(ROWCOUNT => 5000000) ORDER BY 1;
    Show answer & explanation

    Correct answer: A — SELECT SEQ4() AS order_id, UNIFORM(10, 500, RANDOM()) AS amount FROM TABLE(GENERATOR(ROWCOUNT => 5000000));

    • A. `GENERATOR(ROWCOUNT => ...)` inside `TABLE()` produces the rows, `SEQ4()` supplies sequential IDs, and `UNIFORM` fed with `RANDOM()` yields a new value between 10 and 500 per row.
    • B. `RANDOM` accepts only an optional seed, not a range, so passing `10, 500` is invalid. A bounded range requires `UNIFORM`.
    • C. A constant seed of 42 as the third `UNIFORM` argument gives every row the same amount, so the values do not vary randomly across rows.
    • D. The table function must be wrapped as `TABLE(GENERATOR(...))` in the `FROM` clause, so this form is rejected by Snowflake.

    Subdomain 1.3: Enrich data by identifying and accessing relevant data from the Snowflake Marketplace.

    3.A data analyst role named `MKT_ANALYST` must be able to get free Snowflake Marketplace listings on its own, without escalating to ACCOUNTADMIN every time. Which account-level privileges should be granted to the role so it can create a database from a listing?

    1. A.Grant CREATE SHARE and CREATE LISTING on the account to the role, so it can mount provider data as a database.
    2. B.Grant IMPORT SHARE and CREATE DATABASE on the account to the role, so it can mount provider data as a database.
    3. C.Grant MANAGE GRANTS on the account plus USAGE on a warehouse, because listing access is controlled through role grants alone.
    4. D.Grant CREATE DATABASE on the account and USAGE on the provider's database, since the provider already owns the listing's share.
    Show answer & explanation

    Correct answer: B — Grant IMPORT SHARE and CREATE DATABASE on the account to the role, so it can mount provider data as a database.

    • A. CREATE SHARE and CREATE LISTING are provider-side privileges used to publish data, not to consume it, so they do not let a role mount a listing as a database.
    • B. A role with IMPORT SHARE and CREATE DATABASE on the account can get a listing and create the database from it. ACCOUNTADMIN holds these by default, but they can be delegated to an analyst role.
    • C. MANAGE GRANTS and warehouse USAGE do not include the right to create a database from a share. Without IMPORT SHARE the Get action on the listing is refused.
    • D. A consumer cannot be granted USAGE on a provider's database directly, because the provider's database does not exist in the consumer account until it is created from the share. IMPORT SHARE is still missing.

    Subdomain 1.4: Use best practice considerations relating to data integrity structures.

    4.A data analyst loads daily order extracts into a standard Snowflake table `sales.orders` whose `order_id` primary key is not enforced. Replays of extract files must not create duplicate orders. Select TWO approaches that keep `order_id` unique without changing the table type.(Select 2)

    1. A.Load the files into a staging table first, then run `MERGE INTO sales.orders` keyed on `order_id` with a `WHEN NOT MATCHED THEN INSERT` clause only.
    2. B.Insert from staging using `QUALIFY ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY loaded_at DESC) = 1` after excluding keys already present in the target.
    3. C.Alter the table with `ADD PRIMARY KEY (order_id) ENFORCED` so that the next INSERT carrying a repeated `order_id` is rejected by the engine.
    4. D.Set the existing primary key to `RELY` so the load statement checks each incoming `order_id` against the key and aborts when it finds a repeated value.
    5. E.Switch the session to `CONSTRAINT_ENFORCEMENT = TRUE` before the COPY INTO command, which makes Snowflake validate every declared key during loading.
    Show answer & explanation

    Correct answers: A, B — Load the files into a staging table first, then run `MERGE INTO sales.orders` keyed on `order_id` with a `WHEN NOT MATCHED THEN INSERT` clause only.; Insert from staging using `QUALIFY ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY loaded_at DESC) = 1` after excluding keys already present in the target.

    • A. Correct: a MERGE that only inserts unmatched keys applies the uniqueness rule inside the load itself, so replayed rows find a match and are not inserted again.
    • B. Correct: deduplicating the staged rows with ROW_NUMBER and filtering out keys already in the target guarantees that only one new row per `order_id` is inserted.
    • C. Incorrect: Snowflake has no `ENFORCED` keyword for standard-table key constraints, so this statement is not valid and would not add enforcement.
    • D. Incorrect: `RELY` only tells the optimizer it may trust the key for query rewrites. It never validates or rejects rows during a load.
    • E. Incorrect: no `CONSTRAINT_ENFORCEMENT` session parameter exists, and standard-table keys stay informational regardless of session settings.

    Subdomain 1.4: Use best practice considerations relating to data integrity structures.

    5.A data analyst must document the data model for the `sales.order_lines` child table and needs to identify which parent tables and columns its declared foreign keys point to. Which command returns this information?

    1. A.`SHOW EXPORTED KEYS IN TABLE sales.order_lines;`
    2. B.`SHOW PRIMARY KEYS IN TABLE sales.order_lines;`
    3. C.`SHOW IMPORTED KEYS IN TABLE sales.order_lines;`
    4. D.`SHOW UNIQUE KEYS IN TABLE sales.order_lines;`
    Show answer & explanation

    Correct answer: C — `SHOW IMPORTED KEYS IN TABLE sales.order_lines;`

    • A. Incorrect: exported keys show foreign keys in other tables that reference this table's primary key, so for a child table it describes the wrong direction.
    • B. Incorrect: this lists the primary key columns of the child table itself, not the parents it references.
    • C. Correct: imported keys list the foreign keys defined on the table together with the parent table and columns they reference.
    • D. Incorrect: this lists the unique constraint columns of the child itself and shows nothing about foreign key relationships.

    Subdomain 1.5: Implement data processing solutions.

    6.A task runs every minute to merge CDC rows from the stream `RAW_ORDERS_STRM` into a conformed `ORDERS` table. Most runs find no new rows, yet the warehouse resumes each minute and credit usage is high. Which change removes the wasted compute while keeping the one-minute check?

    1. A.Change the schedule to `USING CRON * * * * * UTC`, which lets Snowflake coalesce consecutive runs that would process no new rows in the stream, saving credits.
    2. B.Set `AUTO_SUSPEND = 0` on the task's warehouse so it stays warm, letting each empty run finish faster than one that needs a cold resume.
    3. C.Add `WHEN SYSTEM$STREAM_HAS_DATA('RAW_ORDERS_STRM')` to the task definition so runs with an empty stream are skipped before the warehouse resumes.
    4. D.Wrap the MERGE in a stored procedure that counts stream rows first and returns early, keeping the scheduled task body otherwise unchanged.
    Show answer & explanation

    Correct answer: C — Add `WHEN SYSTEM$STREAM_HAS_DATA('RAW_ORDERS_STRM')` to the task definition so runs with an empty stream are skipped before the warehouse resumes.

    • A. Incorrect. A CRON expression only defines when runs are attempted; Snowflake does not merge or skip runs based on whether a stream holds data.
    • B. Incorrect. Disabling auto-suspend keeps the warehouse billing continuously, which increases credit usage rather than reducing it.
    • C. Correct. The `WHEN` condition is evaluated by the cloud services layer before compute is started, so an empty stream skips the run and the warehouse never resumes.
    • D. Incorrect. The stored procedure executes on the task's warehouse, so the warehouse still resumes every minute just to discover that there is nothing to merge.

    Subdomain 1.5: Implement data processing solutions.

    7.A nightly pipeline is built as a task graph: `LOAD_RAW` must run at 01:00 UTC, then `CLEAN_ORDERS`, then `ENRICH_ORDERS`. Which statement correctly describes how scheduling is set up for this task graph?

    1. A.Give the last task, `ENRICH_ORDERS`, the `SCHEDULE`, so that Snowflake runs the earlier tasks in the dependency order from that final task.
    2. B.Give every task its own `SCHEDULE` using `USING CRON` offsets of a few minutes, so each later task starts at a staggered time after the root in sequence.
    3. C.Give `LOAD_RAW` the `SCHEDULE` and declare each later task with an `AFTER` clause naming its predecessor, so only the root task carries a schedule.
    4. D.Give each later task a `WHEN` clause naming its predecessor, since `WHEN` is the clause that makes a child task wait for the parent run.
    Show answer & explanation

    Correct answer: C — Give `LOAD_RAW` the `SCHEDULE` and declare each later task with an `AFTER` clause naming its predecessor, so only the root task carries a schedule.

    • A. Incorrect. Scheduling the last task would run only that task; Snowflake does not walk backward to start predecessors, so the graph needs the schedule on the root.
    • B. Incorrect. Tasks that use `AFTER` cannot have their own schedule, and staggered CRON times would not guarantee that the predecessor had completed.
    • C. Correct. In a task graph only the root task has a schedule, and the `AFTER` clause makes each child run once its predecessor has finished successfully.
    • D. Incorrect. `WHEN` is a Boolean condition such as a stream-has-data check; it does not declare a dependency, which is the job of `AFTER`.

    Subdomain 1.2: Perform data discovery to identify what is needed from the available datasets.

    8.An analyst runs this query to find IDs that are legacy or that were migrated in both new systems: ``` SELECT id FROM legacy_ids UNION SELECT id FROM new_a INTERSECT SELECT id FROM new_b ``` Which result does Snowflake return?

    1. A.Every ID from the three tables with duplicates retained, because INTERSECT behaves like UNION ALL when the column lists are identical
    2. B.All IDs from `legacy_ids` plus the IDs found in both `new_a` and `new_b`, de-duplicated, because INTERSECT is evaluated before UNION
    3. C.IDs from `legacy_ids` and `new_a` combined first, then limited to those also in `new_b`, because the first two queries are grouped together
    4. D.Only IDs present in all three tables, because Snowflake evaluates chained set operators strictly from left to right without exception
    Show answer & explanation

    Correct answer: B — All IDs from `legacy_ids` plus the IDs found in both `new_a` and `new_b`, de-duplicated, because INTERSECT is evaluated before UNION

    • A. INTERSECT returns only rows common to both inputs, and UNION removes duplicates, so duplicates are not retained and the operators do not behave as UNION ALL.
    • B. INTERSECT has higher precedence than UNION, EXCEPT and MINUS in Snowflake, so new_a and new_b are intersected first and the result is then unioned with legacy IDs. Parentheses can be added to force a different order.
    • C. That reading would apply when the UNION is parenthesised first. Without parentheses, INTERSECT is evaluated first, so the grouping differs.
    • D. Snowflake does not evaluate these operators strictly left to right. INTERSECT binds tighter, so the result is not the three-way intersection.

    Subdomain 1.6: Given a scenario, prepare data and load into Snowflake.

    9.A single file `orders.json` in an internal stage holds one top-level JSON array with 80,000 order objects. After `COPY INTO raw_orders (v) FROM @json_stage FILE_FORMAT = (TYPE = JSON)`, the VARIANT table has one row, so a report that counts orders returns 1. Which JSON file format option loads each order as its own row?

    1. A.`STRIP_NULL_VALUES = TRUE`, which drops null elements from the array so the remaining objects are separated into individual rows
    2. B.`ALLOW_DUPLICATE = TRUE`, which keeps repeated object keys during parsing so every object in the array is written as its own row
    3. C.`ENABLE_OCTAL = TRUE`, which parses the array delimiters as numeric tokens so a new row starts at each comma-separated element
    4. D.`STRIP_OUTER_ARRAY = TRUE`, which removes the enclosing brackets so each object inside the array is loaded as a separate row
    Show answer & explanation

    Correct answer: D — `STRIP_OUTER_ARRAY = TRUE`, which removes the enclosing brackets so each object inside the array is loaded as a separate row

    • A. `STRIP_NULL_VALUES` removes object fields and array elements that are null. It does not split the outer array into rows.
    • B. `ALLOW_DUPLICATE` controls whether duplicate field names inside an object are kept. It has no effect on row splitting.
    • C. `ENABLE_OCTAL` only changes how numbers with leading zeros are parsed. It has no bearing on array handling.
    • D. Correct. `STRIP_OUTER_ARRAY = TRUE` removes the outer brackets, so each element of the array becomes a separate row in the VARIANT column. Alternatively, `LATERAL FLATTEN` could split the array after loading.

    Subdomain 1.7: Given a scenario, use Snowflake functions.

    10.A finance dashboard reads table `payments` where some rows have a NULL `amount` because the charge is still pending. The business wants the average ticket to treat pending payments as zero, and also a count of payments that already have a recorded amount. Select TWO expressions that together meet both requirements.(Select 2)

    1. A.Use `AVG(COALESCE(amount, 0))` so that pending rows enter the denominator with a value of zero instead of being skipped by the aggregate.
    2. B.Use `COUNT(amount)` so that only rows holding a non-NULL amount are counted, which excludes the pending payments from the tally.
    3. C.Use `AVG(amount)` so that pending rows contribute zero to the sum and are still counted in the denominator for the mean value.
    4. D.Use `COUNT(*)` so that the result reflects only rows that have a recorded amount and silently skips any row where `amount` is NULL.
    5. E.Use `SUM(amount) / COUNT(amount)` so that NULL amounts are replaced by zero before the division and the ratio matches the requirement.
    Show answer & explanation

    Correct answers: A, B — Use `AVG(COALESCE(amount, 0))` so that pending rows enter the denominator with a value of zero instead of being skipped by the aggregate.; Use `COUNT(amount)` so that only rows holding a non-NULL amount are counted, which excludes the pending payments from the tally.

    • A. Correct: COALESCE replaces NULL with 0 before AVG runs, so pending rows count in the denominator as zero, which is exactly the requested treatment.
    • B. Correct: COUNT with a column argument counts only non-NULL values, so it returns the number of payments that have a recorded amount.
    • C. Incorrect: AVG ignores NULL inputs, so pending rows are excluded from both sum and denominator and the average is higher than the business wants.
    • D. Incorrect: COUNT(*) counts every row including those with a NULL amount, so it does not isolate payments with a recorded amount.
    • E. Incorrect: SUM ignores NULLs and COUNT(amount) skips them, so this ratio equals a plain AVG(amount) and never treats pending payments as zero.

    Subdomain 1.7: Given a scenario, use Snowflake functions.

    11.A table `events` has a VARIANT column `payload` whose `items` key holds an array of objects, each with `sku` and `qty`. An analyst must return one output row per array element together with the parent `event_id`. Which approach does this?

    1. A.Join with `LATERAL FLATTEN(input => e.payload:items) f` and read `f.value:sku::STRING` and `f.value:qty::NUMBER` for each element row.
    2. B.Wrap the path in `PARSE_JSON(e.payload:items)` so that every array element is expanded into its own row alongside the parent event row.
    3. C.Apply `ARRAY_SIZE(e.payload:items)` in the FROM clause so that the function returns one row for each element found in the array.
    4. D.Call `SPLIT_TO_TABLE(e.payload:items, ',')` in the FROM clause so that every comma-separated array element becomes its own output row.
    Show answer & explanation

    Correct answer: A — Join with `LATERAL FLATTEN(input => e.payload:items) f` and read `f.value:sku::STRING` and `f.value:qty::NUMBER` for each element row.

    • A. Correct: FLATTEN is a table function, and LATERAL lets it reference the outer row, producing one row per array element with `value` holding each object.
    • B. Incorrect: PARSE_JSON converts a string into a VARIANT but returns a single value per input row, so the array is not expanded into separate rows.
    • C. Incorrect: ARRAY_SIZE is a scalar function that returns the number of elements as one number per row, and it cannot be used in FROM to produce rows.
    • D. Incorrect: SPLIT_TO_TABLE splits a string on a delimiter, so it is meant for text and does not iterate the elements of a VARIANT array of objects.

    Domain 2: Data Transformation and Data Modeling

    Subdomain 2.1: Prepare different data types into a consumable format.

    12.An analyst flattens a JSON array of readings with `LATERAL FLATTEN(input => r.doc:readings) f` and needs two columns: the numeric position of each element in the array and the element itself as a VARIANT. Select TWO FLATTEN output columns.(Select 2)

    1. A.INDEX
    2. B.KEY
    3. C.VALUE
    4. D.SEQ
    5. E.THIS
    Show answer & explanation

    Correct answers: A, C — INDEX; VALUE

    • A. Correct. INDEX holds the zero-based position of the element when the input is an array. It gives the numeric position the analyst needs.
    • B. KEY holds the property name when flattening an object, and is NULL when the input is an array. It cannot give the position of an array element.
    • C. Correct. VALUE contains the element at the current position as a VARIANT. It can be cast or navigated with path notation.
    • D. SEQ is a unique sequence number for each flattened input row, not the position of an element within the array. It would not distinguish elements inside one array.
    • E. THIS holds the whole collection being flattened, so every output row from one array repeats the same value. It does not provide an element or its position.

    Subdomain 2.1: Prepare different data types into a consumable format.

    13.Which function converts a VARCHAR value that contains JSON text into a VARIANT that can be queried with path notation?

    1. A.`TO_JSON`
    2. B.`PARSE_JSON`
    3. C.`OBJECT_CONSTRUCT`
    4. D.`TO_ARRAY`
    Show answer & explanation

    Correct answer: B — `PARSE_JSON`

    • A. TO_JSON does the reverse operation: it serializes a VARIANT into JSON text. It does not parse text.
    • B. Correct. PARSE_JSON interprets a JSON string and returns a VARIANT. The result supports path notation and FLATTEN.
    • C. OBJECT_CONSTRUCT builds an object from key and value arguments. It does not interpret a JSON string.
    • D. TO_ARRAY converts a single value into an array. It does not parse JSON text into objects.

    Subdomain 2.3: Given a dataset or scenario, work with and query the data.

    14.A finance analyst has a `monthly_revenue` table with `month` and `revenue` columns and wants month-over-month percentage change. The first month has no prior value, and some months have zero revenue that must not raise a divide-by-zero error. Select TWO elements that belong in the query.(Select 2)

    1. A.Compute the prior value with `LEAD(revenue) OVER (ORDER BY month)` and use it as the baseline in the percentage formula.
    2. B.Divide the difference by `NULLIF(prev_revenue, 0)` so a zero baseline yields NULL instead of a division error.
    3. C.Fetch the prior month with `LAG(revenue) OVER (ORDER BY month)`, which returns NULL for the first month automatically.
    4. D.Use `COALESCE(prev_revenue, 0)` as the denominator so the first month shows a change instead of NULL.
    5. E.Compute the prior value with `LAG(revenue) OVER (PARTITION BY month ORDER BY month)` to keep each month in its own window.
    Show answer & explanation

    Correct answers: B, C — Divide the difference by `NULLIF(prev_revenue, 0)` so a zero baseline yields NULL instead of a division error.; Fetch the prior month with `LAG(revenue) OVER (ORDER BY month)`, which returns NULL for the first month automatically.

    • A. LEAD returns the following month's revenue, so the formula would compare each month to the future and the sign of the change would be reversed.
    • B. NULLIF turns a zero denominator into NULL, and the division then returns NULL rather than failing, which is acceptable for a month with no meaningful baseline.
    • C. LAG reads the previous row in month order, and because no earlier row exists for the first month it yields NULL, which flows through to a NULL change.
    • D. Replacing the missing baseline with zero makes the denominator zero for the first month, which causes the very division-by-zero error the analyst wants to avoid.
    • E. Partitioning by month puts every row alone in its partition, so LAG finds no previous row and returns NULL for every month.

    Subdomain 2.3: Given a dataset or scenario, work with and query the data.

    15.An analyst runs `NTILE(4) OVER (ORDER BY order_total)` over exactly 10 order rows to assign spending quartiles. How are the 10 rows distributed across the four buckets?

    1. A.Buckets 1 and 2 receive three rows each, and buckets 3 and 4 receive two rows each, because remainder rows go to the lowest-numbered buckets.
    2. B.Buckets 1 and 2 receive two rows each, and buckets 3 and 4 receive three rows each, because remainder rows go to the highest-numbered buckets.
    3. C.Buckets 1, 2 and 3 receive two rows each and bucket 4 receives the remaining four rows, because NTILE fills the final bucket last.
    4. D.The query fails with an error because ten rows cannot be divided into four equal groups, so NTILE requires an exact multiple of the bucket count.
    Show answer & explanation

    Correct answer: A — Buckets 1 and 2 receive three rows each, and buckets 3 and 4 receive two rows each, because remainder rows go to the lowest-numbered buckets.

    • A. When the row count does not divide evenly, NTILE assigns the extra rows to the earliest buckets, giving sizes of 3, 3, 2 and 2.
    • B. NTILE places the leftover rows in the first buckets, not the last, so the larger groups are at the low end of the ordering.
    • C. NTILE spreads the remainder one row at a time across buckets, so no bucket can differ from another by more than one row.
    • D. NTILE does not require divisibility; it handles uneven counts by giving some buckets one extra row, and the query runs normally.

    Subdomain 2.5: Optimize query performance.

    16.A query joins `orders` (50 million rows) to `order_items` (200 million rows). In Query Profile, the Join node shows about 90 billion rows output, and the query never finishes on a LARGE warehouse. What is the most likely cause?

    1. A.The join condition is missing or matches on a non-unique key, producing a Cartesian-like row explosion between the two tables
    2. B.The result cache returned an outdated copy of `orders`, so the join pairs current items with obsolete order rows repeatedly
    3. C.The warehouse has too few micro-partition caches, so the join must read both tables again from remote storage for every row
    4. D.Automatic clustering is suspended on `order_items`, which lets Snowflake generate duplicate rows while rebuilding the join keys
    Show answer & explanation

    Correct answer: A — The join condition is missing or matches on a non-unique key, producing a Cartesian-like row explosion between the two tables

    • A. A Join node whose output is far larger than both inputs signals a row explosion, typically from a missing, partial or non-unique join predicate.
    • B. A cached result would be returned instead of running the join, and it could not cause a multiplied intermediate output.
    • C. Cache misses slow the scan nodes but do not multiply row counts. The output size from the Join node would remain bounded by the inputs.
    • D. Clustering never creates or duplicates rows. It changes only the physical arrangement of micro-partitions.

    Subdomain 2.5: Optimize query performance.

    17.An analyst asks for a way to inspect the execution plan of a query, including how many micro-partitions it would scan, without actually running it. Which statement does this?

    1. A.`DESCRIBE RESULT LAST_QUERY_ID()` returns an operator tree with row counts for each node of the previous statement
    2. B.`EXPLAIN USING TEXT SELECT ...` returns the plan with `partitionsAssigned` and `partitionsTotal` without executing it
    3. C.`SHOW PARAMETERS LIKE 'QUERY_TAG'` lists the access path that the optimizer chose for the statement that ran most recently
    4. D.`SELECT SYSTEM$CLUSTERING_INFORMATION(...)` returns the plan operators and join order for any statement you pass in as text
    Show answer & explanation

    Correct answer: B — `EXPLAIN USING TEXT SELECT ...` returns the plan with `partitionsAssigned` and `partitionsTotal` without executing it

    • A. DESCRIBE RESULT returns the column definitions of a previous result and not the operator-level plan.
    • B. EXPLAIN compiles the statement and shows the plan with partition estimates, with no execution and no result.
    • C. This command lists parameter values only. It carries no plan or partition information.
    • D. That function reports clustering depth statistics for a table and columns. It does not provide a query's execution plan.

    Subdomain 2.2: Given a dataset, clean the data.

    18.A table has VARCHAR column `amount_txt` holding values such as '19.99' and 'N/A'. The analyst needs a NUMBER(12,2) result where 'N/A' yields NULL instead of an error. Select TWO expressions that do this.(Select 2)

    1. A.amount_txt::NUMBER(12,2)
    2. B.TO_NUMBER(amount_txt, 12, 2)
    3. C.TRY_TO_NUMBER(amount_txt, 12, 2)
    4. D.TRY_CAST(amount_txt AS NUMBER(12,2))
    5. E.CAST(amount_txt AS NUMBER(12,2))
    Show answer & explanation

    Correct answers: C, D — TRY_TO_NUMBER(amount_txt, 12, 2); TRY_CAST(amount_txt AS NUMBER(12,2))

    • A. Incorrect. The double-colon shorthand is equivalent to CAST and fails on non-numeric text.
    • B. Incorrect. TO_NUMBER raises an error as soon as it meets 'N/A', so the query fails rather than returning NULL.
    • C. Correct. The TRY_ conversion returns NULL for strings that cannot be parsed, so 'N/A' becomes NULL while '19.99' converts normally.
    • D. Correct. TRY_CAST accepts a string input and returns NULL instead of raising an error when the conversion fails.
    • E. Incorrect. A plain CAST is the strict form and errors on a non-numeric string.

    Subdomain 2.2: Given a dataset, clean the data.

    19.At 14:00 a DELETE wrongly removed rows from `invoices`, which still exists. It is now 17:00 and the retention period is seven days. Select TWO approaches that recover the missing data.(Select 2)

    1. A.Open a Snowflake Support case to restore the rows from Fail-safe storage, because deleted rows are moved there immediately after DELETE
    2. B.Run `RESTORE TABLE invoices TO TIMESTAMP '2026-10-05 13:59:00'` to roll back the table in place using its retention history
    3. C.Run `UNDROP TABLE invoices` to bring back the deleted rows from the table's most recent retained version in Time Travel history
    4. D.Clone with `CREATE TABLE invoices_recovered CLONE invoices AT (TIMESTAMP => '2026-10-05 13:59:00'::TIMESTAMP_LTZ)`, then merge missing rows
    5. E.Insert rows from `invoices BEFORE (STATEMENT => '<delete query id>')` whose `invoice_id` is absent from the current table
    Show answer & explanation

    Correct answers: D, E — Clone with `CREATE TABLE invoices_recovered CLONE invoices AT (TIMESTAMP => '2026-10-05 13:59:00'::TIMESTAMP_LTZ)`, then merge missing rows; Insert rows from `invoices BEFORE (STATEMENT => '<delete query id>')` whose `invoice_id` is absent from the current table

    • A. Incorrect. Fail-safe only applies after the Time Travel period ends and is not self-service, so it is irrelevant while retention is still active.
    • B. Incorrect. Snowflake has no RESTORE TABLE command; recovery is done through cloning or querying with AT/BEFORE.
    • C. Incorrect. UNDROP restores dropped objects, not deleted rows in a table that still exists.
    • D. Correct. The clone captures the table from just before the delete, within the retention window, and the missing rows can then be copied across.
    • E. Correct. Time Travel can query the table as it was before the delete statement, and filtering on missing keys restores only the lost rows.

    Subdomain 2.4: Use data modeling to manipulate the data to meet BI requirements.

    20.Customers occasionally move between sales regions. Finance requires that revenue be reported against the region the customer belonged to on the date of each sale. Which dimension design supports this?

    1. A.Overwrite the region on the existing customer row, so every fact row follows the customer's current region after each move
    2. B.Keep a single previous_region column next to the current region, so only the most recent prior value is retained
    3. C.Insert a new customer row per change with surrogate key, validity dates and current flag; facts load with the key in effect
    4. D.Keep one customer row and query it with Time Travel AT(TIMESTAMP) for each fact row to retrieve the region at the sale time
    Show answer & explanation

    Correct answer: C — Insert a new customer row per change with surrogate key, validity dates and current flag; facts load with the key in effect

    • A. A type 2 slowly changing dimension keeps each version under its own surrogate key, so a fact row points at the version valid at sale time. Aggregations by region then reproduce history correctly.
    • B. Overwriting is a type 1 approach and rewrites history, so old sales would be reported under the new region. That contradicts the finance requirement.
    • C. A type 3 design holds only one earlier value, so a customer who moves twice loses the first region. It cannot give the region as of each sale date.
    • D. Time Travel retention is limited and querying it per fact row is impractical for reporting. History needed for BI belongs in the model itself.

    Subdomain 2.4: Use data modeling to manipulate the data to meet BI requirements.

    21.An analyst joins ORDERS, with one row per order, to SHIPMENTS, which can hold several rows per order. SUM(order_total) by customer now overstates revenue while shipping cost looks right. Select TWO fixes.(Select 2)

    1. A.Aggregate SHIPMENTS to one row per order in a subquery or CTE before joining it to ORDERS at order grain
    2. B.Wrap the measure as SUM(DISTINCT order_total) so repeated values are counted only once for each customer
    3. C.Model each process as its own fact at its own grain, aggregate each, then combine via shared dimensions
    4. D.Change the INNER JOIN to a LEFT JOIN so that every order appears only one time in the joined result
    5. E.Add a clustering key on order_id in SHIPMENTS so the join returns a single matching row per order
    Show answer & explanation

    Correct answers: A, C — Aggregate SHIPMENTS to one row per order in a subquery or CTE before joining it to ORDERS at order grain; Model each process as its own fact at its own grain, aggregate each, then combine via shared dimensions

    • A. Pre-aggregating the many-side to the order grain makes the join one-to-one, so order_total is no longer repeated. This removes the fan-out at its source.
    • B. SUM(DISTINCT) drops legitimate repeated values, such as two different orders with the same total. It hides duplication by corrupting the sum.
    • C. Facts at different grains should not be joined row to row. Aggregating each fact and joining on conformed dimensions avoids multiplying measures.
    • D. A LEFT JOIN keeps unmatched orders but still returns one row per matching shipment. The duplication of order_total remains.
    • E. Clustering affects micro-partition pruning and not join cardinality. The join would still produce multiple rows for orders with multiple shipments.

    Domain 3: Data Analysis

    Subdomain 3.3: Perform diagnostic analyses.

    22.A churn dashboard shows overall churn is flat, yet product managers believe one age group is leaving. The analyst runs `SELECT age_band, plan, COUNT(*) AS customers, AVG(churned::INT) AS churn_rate FROM customers GROUP BY age_band, plan`. Why is this a good diagnostic step?

    1. A.Grouping by two columns forces Snowflake to rebuild statistics so that the overall churn rate becomes more accurate.
    2. B.Counting customers per group proves which age band caused churn because count and churn share the same grain.
    3. C.Averaging a Boolean cast removes null customers automatically, which is the true cause of the flat overall rate.
    4. D.Splitting the aggregate by demographic and plan can reveal opposing segment trends that cancel out overall.
    Show answer & explanation

    Correct answer: D — Splitting the aggregate by demographic and plan can reveal opposing segment trends that cancel out overall.

    • A. Incorrect: GROUP BY does not rebuild statistics or change how the overall rate is calculated; it only adds finer grouping.
    • B. Incorrect: counts show segment size, not cause; the result describes association only and does not prove causation.
    • C. Incorrect: AVG ignores nulls, but that behavior is not the reason for a flat total, and it does not diagnose segments.
    • D. Correct: segment-level rates can show that one demographic worsens while another improves, a pattern hidden when only the combined rate is viewed.

    Subdomain 3.3: Perform diagnostic analyses.

    23.A fraud analyst flags transactions that sit more than three standard deviations from each merchant's mean. Select TWO SQL building blocks that together compute this per-merchant z-score in one query.(Select 2)

    1. A.`MEDIAN(amount) GROUP BY merchant_id` placed inside the SELECT list without any grouping clause.
    2. B.`NTILE(3) OVER (ORDER BY amount)` to label each transaction with the number of deviations it carries.
    3. C.`AVG(amount) OVER (PARTITION BY merchant_id)` to get each merchant's mean on every transaction row.
    4. D.`STDDEV_SAMP(amount) OVER (PARTITION BY merchant_id)` to get each merchant's spread on every row.
    5. E.`CORR(amount, merchant_id)` to measure how far each amount is from the merchant's mean.
    Show answer & explanation

    Correct answers: C, D — `AVG(amount) OVER (PARTITION BY merchant_id)` to get each merchant's mean on every transaction row.; `STDDEV_SAMP(amount) OVER (PARTITION BY merchant_id)` to get each merchant's spread on every row.

    • A. Incorrect: MEDIAN is not a mean, and GROUP BY cannot be placed inside a select expression like that; it would also collapse the rows.
    • B. Incorrect: NTILE creates equal-size buckets by rank and does not count standard deviations from a mean.
    • C. Correct: a window average partitioned by merchant supplies the mean needed for the z-score without collapsing rows.
    • D. Correct: a partitioned sample standard deviation supplies the denominator, so (amount - mean) / stddev can be filtered at three.
    • E. Incorrect: CORR measures the relationship between two numeric columns, and a merchant identifier is not a meaningful numeric input.

    Subdomain 3.2: Perform descriptive analyses.

    24.Which statements about who can use and manage a Snowsight custom filter are accurate? Select TWO.(Select 2)

    1. A.A filter needs no warehouse association, since its options query is evaluated entirely in the Snowsight client application
    2. B.Anyone in the account can view and use a custom filter once it exists, regardless of the role associated with the filter
    3. C.Only users holding the same role as the filter creator can select values from the filter dropdown on a shared dashboard
    4. D.The role associated with a filter determines which users are allowed to edit or delete that filter after it was created
    5. E.Deleting the dashboard that first used the filter automatically deletes the filter definition for every other dashboard too
    Show answer & explanation

    Correct answers: B, D — Anyone in the account can view and use a custom filter once it exists, regardless of the role associated with the filter; The role associated with a filter determines which users are allowed to edit or delete that filter after it was created

    • A. A query-based filter runs its options query on compute, so it is associated with a role and warehouse.
    • B. Visibility and use are account-wide, so a filter created by one team can be picked up by others.
    • C. Selecting values is not limited to the owning role. Using a filter is open to the account.
    • D. The attached role controls modification rights, which is how ownership is expressed for these objects.
    • E. Filters exist independently of any single dashboard, so removing one dashboard leaves the definition intact.

    Subdomain 3.2: Perform descriptive analyses.

    25.What is the maximum number of result rows that a Snowsight worksheet can display in the results table for most accounts?

    1. A.One hundred thousand rows, which can be raised by setting a session parameter named `UI_ROW_LIMIT` in the worksheet
    2. B.Ten thousand rows, with larger results automatically routed into a temporary table that you query separately
    3. C.One million rows can be displayed in the results panel, after which the data must be exported or aggregated
    4. D.There is no limit, because results stream from the cloud services layer into the browser as the user scrolls
    Show answer & explanation

    Correct answer: C — One million rows can be displayed in the results panel, after which the data must be exported or aggregated

    • A. `UI_ROW_LIMIT` does not exist.
    • B. The display cap is far higher, and no temporary table is created for overflow.
    • C. Worksheet results tables show up to 1 million rows for most accounts.
    • D. A cap applies, so very large results must be aggregated or exported.

    Subdomain 3.4: Perform forecasting.

    26.A dashboard developer must write a query over the output of a forecast call and needs to reference the predicted value and its uncertainty range. Which columns does the output contain?

    1. A.MODEL_NAME, TS, FORECAST and FEATURE_IMPORTANCE, with one importance value repeated for each forecasted timestamp.
    2. B.SERIES, DATE, PREDICTED_VALUE, CONFIDENCE_LOW and CONFIDENCE_HIGH, with DATE typed as VARCHAR in the output table.
    3. C.SERIES, TS, FORECAST, LOWER_BOUND and UPPER_BOUND, with SERIES holding NULL when the model was trained on a single series.
    4. D.TS, FORECAST and ERROR_PCT, where ERROR_PCT carries the MAPE calculated for each individual forecasted timestamp, per series.
    Show answer & explanation

    Correct answer: C — SERIES, TS, FORECAST, LOWER_BOUND and UPPER_BOUND, with SERIES holding NULL when the model was trained on a single series.

    • A. Incorrect. Importance is available through its own method, and the output does not carry model name or importance columns.
    • B. Incorrect. Those column names are invented; the real output uses TS, FORECAST, LOWER_BOUND and UPPER_BOUND.
    • C. Correct. These are the standard output columns, and the series label is only populated for multi-series models.
    • D. Incorrect. Error metrics come from SHOW_EVALUATION_METRICS and cannot be computed for future dates.

    Subdomain 3.4: Perform forecasting.

    27.A reporting note says the forecast shows a band around each predicted value. Without any change to the config, what coverage does that band represent?

    1. A.A 68 percent prediction interval, because the default band is one standard deviation around the point forecast.
    2. B.A 90 percent prediction interval, because the default prediction_interval is 0.9 for models trained with method 'best'.
    3. C.A 99 percent prediction interval, because the default prediction_interval is 0.99 when evaluation is enabled during training.
    4. D.A 95 percent prediction interval, because the default prediction_interval value is 0.95 for a forecast call.
    Show answer & explanation

    Correct answer: D — A 95 percent prediction interval, because the default prediction_interval value is 0.95 for a forecast call.

    • A. Incorrect. The band is not defined as one standard deviation and defaults to 95 percent coverage.
    • B. Incorrect. The default is 0.95 and does not depend on the method.
    • C. Incorrect. Enabling evaluation does not change the interval level, which defaults to 0.95.
    • D. Correct. The default level is 0.95, and it can be overridden through the config object.

    Subdomain 3.1: Use SQL extensibility features.

    28.A cleansing function `clean_email(e STRING)` is expensive. Analysts want Snowflake to skip running the body and simply return NULL whenever the input is NULL. Which clause should be added to the definition?

    1. A.`CALLED ON NULL INPUT`, so the function body is skipped whenever any argument is NULL at run time
    2. B.`IMMUTABLE`, so Snowflake caches the result and replaces NULL inputs with the last non-NULL result
    3. C.`RETURNS NULL ON NULL INPUT`, so a NULL argument returns NULL without executing the body
    4. D.`COMMENT = 'skip nulls'`, so the optimizer reads the comment and bypasses evaluation of NULL values in rows
    Show answer & explanation

    Correct answer: C — `RETURNS NULL ON NULL INPUT`, so a NULL argument returns NULL without executing the body

    • A. CALLED ON NULL INPUT is the default and does the opposite: the body is executed even when arguments are NULL.
    • B. IMMUTABLE only declares that the same input always yields the same output; it does not alter NULL handling.
    • C. This setting (equivalent to STRICT) short-circuits NULL inputs and returns NULL immediately, avoiding wasted evaluation.
    • D. COMMENT is documentation metadata and has no effect on execution behavior.

    Subdomain 3.1: Use SQL extensibility features.

    29.A Snowflake Scripting procedure runs three independent `INSERT ... SELECT` statements into different reporting tables, one after another, and the total runtime is too long. The statements do not depend on each other. What change reduces the elapsed time?

    1. A.Wrap the three statements in a single `BEGIN TRANSACTION` block, which executes its statements in parallel
    2. B.Start each statement as a child job with `ASYNC`, then run `AWAIT ALL` so the procedure waits for them
    3. C.Convert the procedure to a scalar UDF, which runs the inserts for each statement in parallel
    4. D.Add `EXECUTE AS CALLER`, which assigns a separate warehouse thread to every statement in the body
    Show answer & explanation

    Correct answer: B — Start each statement as a child job with `ASYNC`, then run `AWAIT ALL` so the procedure waits for them

    • A. Transactions group statements atomically but still run them sequentially.
    • B. ASYNC starts child jobs without blocking, so independent statements run concurrently, and AWAIT ALL ensures the procedure continues only after all complete.
    • C. UDFs cannot run DML, so the inserts could not be performed that way.
    • D. Execution rights control privileges, not concurrency.

    Domain 4: Data Presentation and Data Visualization

    Subdomain 4.1: Given a use case, create reports and dashboards to meet business requirements.

    30.A new Snowsight dashboard for the finance team will run twelve tiles against the FINANCE_MART database. The owner wants it to run reliably for viewers. Select TWO items that must be in place for the tile queries to execute.(Select 2)

    1. A.The warehouse chosen in the context selector is one the selected role can USAGE-operate, so tile queries have compute to run on.
    2. B.The role selected in the dashboard context selector holds SELECT privileges on every table or view the tiles query.
    3. C.The dashboard owner must switch the context selector to ACCOUNTADMIN so that tiles can read objects across all schemas.
    4. D.Each viewer needs a personal database context saved in their user profile, which Snowsight applies to every tile automatically.
    5. E.The selected warehouse must be configured as multi-cluster, because a dashboard issues several tile queries concurrently on open.
    Show answer & explanation

    Correct answers: A, B — The warehouse chosen in the context selector is one the selected role can USAGE-operate, so tile queries have compute to run on.; The role selected in the dashboard context selector holds SELECT privileges on every table or view the tiles query.

    • A. Correct. Every tile query needs a warehouse, and the selected role must hold USAGE on it, otherwise the tile fails or never starts.
    • B. Correct. Tile queries run under the role chosen in the context selector, so that role needs SELECT on each referenced object or the tile returns an authorization error.
    • C. Incorrect. ACCOUNTADMIN is not required and would violate least privilege; any role with the right object grants is enough.
    • D. Incorrect. Snowsight has no per-viewer profile database setting that is applied to dashboard tiles; context comes from the dashboard and tile settings.
    • E. Incorrect. A standard single-cluster warehouse can run dashboard tiles; multi-cluster only helps with heavy concurrency and is not a requirement.

    Subdomain 4.1: Given a use case, create reports and dashboards to meet business requirements.

    31.A DATA_ENG role created a custom filter. An analyst on ANALYST_ROLE wants to edit it, and a new team wants its own filters. Select TWO accurate statements about managing custom filters.(Select 2)

    1. A.The built-in :daterange filter can be deleted by a dashboard's owner once the dashboard has been saved at least once.
    2. B.Any role with USAGE on the dashboard's warehouse is able to edit all custom filters used by tiles that warehouse runs.
    3. C.Every custom filter is associated with a role, and that role can edit or delete it, so ANALYST_ROLE cannot change it.
    4. D.Custom filters belong to the individual who created them and move automatically to a user's manager when that user leaves.
    5. E.ACCOUNTADMIN grants other roles the permission to create custom filters, so the new team needs this grant first.
    Show answer & explanation

    Correct answers: C, E — Every custom filter is associated with a role, and that role can edit or delete it, so ANALYST_ROLE cannot change it.; ACCOUNTADMIN grants other roles the permission to create custom filters, so the new team needs this grant first.

    • A. Incorrect. System filters such as :daterange are built in and can't be edited or removed by dashboard owners.
    • B. Incorrect. Warehouse privileges do not govern filter editing; the associated role does.
    • C. Correct. Filters belong to a role, and only that role can modify or remove them.
    • D. Incorrect. Ownership is tied to a role, not to an individual user or to a manager.
    • E. Correct. Creating custom filters is controlled by a privilege that ACCOUNTADMIN grants to roles.

    Subdomain 4.2: Given a use case, maintain reports and dashboards to meet business requirements.

    32.A dashboard feeding table is updated only when an upstream `ORDERS_STREAM` contains new rows. The team wants a task that runs every five minutes but burns no warehouse credits when the stream is empty. What should the analyst do?

    1. A.Lower the warehouse size to `XSMALL` and set a 60-second auto-suspend so empty runs cost very little each time.
    2. B.Add `WHEN SYSTEM$STREAM_HAS_DATA('ORDERS_STREAM')` to the task definition together with a five-minute schedule.
    3. C.Place an `IF` statement inside the task body that exits early when the stream returns zero rows from a count query.
    4. D.Create an alert with `IF (EXISTS ...)` over the stream and call `EXECUTE TASK` from its action on every cycle.
    Show answer & explanation

    Correct answer: B — Add `WHEN SYSTEM$STREAM_HAS_DATA('ORDERS_STREAM')` to the task definition together with a five-minute schedule.

    • A. Smaller compute reduces cost per run but still resumes the warehouse every five minutes, which the requirement rules out.
    • B. The `WHEN` condition is evaluated in cloud services before compute starts, so empty checks do not consume warehouse credits.
    • C. The task has already started its warehouse by then, so credits are consumed for every empty run.
    • D. An alert is an extra object that also needs scheduling, and it duplicates what the task `WHEN` clause does natively.

    Subdomain 4.2: Given a use case, maintain reports and dashboards to meet business requirements.

    33.A dashboard tile shows `customer_email` from a table protected by a Dynamic Data Masking policy that reveals clear text only to `PII_ADMIN`. The dashboard context role is `BI_READER`. Select TWO outcomes that follow when a user views the dashboard.(Select 2)

    1. A.The masking policy is evaluated at query time using the active role, so the tile returns masked values for `BI_READER`.
    2. B.The tile shows clear text because dashboards run as the creator, who owns the masking policy and may see raw data.
    3. C.Changing the tile's chart type or renaming the column has no effect on the masking, since the policy sits on the table.
    4. D.The masking is applied only when the dashboard is opened in a shared link, and is bypassed in the owner's own view.
    5. E.The tile fails with an authorization error, because dashboards cannot read any column protected by a masking policy.
    Show answer & explanation

    Correct answers: A, C — The masking policy is evaluated at query time using the active role, so the tile returns masked values for `BI_READER`.; Changing the tile's chart type or renaming the column has no effect on the masking, since the policy sits on the table.

    • A. Masking depends on the role in the session context, which for the dashboard is the context role.
    • B. Dashboards do not run as the creator; the context role governs which version of the data is returned.
    • C. Policies are attached to the column at the data layer, so presentation changes cannot expose clear text.
    • D. Masking is not tied to link sharing; it applies wherever the role in use is not allowed to see clear text.
    • E. Masking policies return transformed values rather than errors, so tiles load normally with masked content.

    Subdomain 4.3: Given a use case, incorporate visualizations for dashboards and reports.

    34.A product analyst has 200,000 rows with a numeric `response_ms` column and wants to see how latencies are distributed (many fast requests, a long slow tail) without plotting each row. Which Snowsight configuration helps?

    1. A.A bar chart with `response_ms` bucketed on the X-axis using an integer bucket size and `COUNT` as the aggregated Y-axis measure
    2. B.A line chart of raw `response_ms` ordered alphabetically, because ordering as text sorts the latencies into numeric bins automatically
    3. C.A scorecard bound to `AVG(response_ms)`, because the mean alone reveals the full shape of a long slow tail of requests
    4. D.A heat grid with `response_ms` on both axes and a `MAX` aggregation, so each cell shows the single slowest request
    Show answer & explanation

    Correct answer: A — A bar chart with `response_ms` bucketed on the X-axis using an integer bucket size and `COUNT` as the aggregated Y-axis measure

    • A. Numeric bucketing groups values into ranges, and counting rows per bucket produces a histogram-style distribution.
    • B. Alphabetical ordering of numbers is not binning and gives a misleading sort such as 10 before 9.
    • C. An average hides the shape of the distribution, including any slow tail.
    • D. Putting the same variable on both axes with MAX shows extremes, not frequency of values.

    Subdomain 4.3: Given a use case, incorporate visualizations for dashboards and reports.

    35.A new analyst role `DASH_VIEWER` must be able to open a shared dashboard whose tiles select from `SALES_DB.MART.ORDERS_SUMMARY`. Select THREE privileges or settings the role needs.(Select 3)

    1. A.`USAGE` on a virtual warehouse that the viewer selects as the context for running the dashboard's tile queries
    2. B.`OWNERSHIP` on the dashboard so that the viewer role can run tiles that were created by another analyst
    3. C.`CREATE TABLE` on the `MART` schema so the viewer's role can store tile results as permanent tables for later reuse
    4. D.`USAGE` on the database `SALES_DB` and on the schema `SALES_DB.MART` so the role can resolve the objects the tiles query
    5. E.`MODIFY` on the warehouse so the viewer role may resize it whenever tile queries take longer than expected to return results
    6. F.`SELECT` on the `ORDERS_SUMMARY` table or view so the tile queries can read its rows when the role runs them
    Show answer & explanation

    Correct answers: A, D, F — `USAGE` on a virtual warehouse that the viewer selects as the context for running the dashboard's tile queries; `USAGE` on the database `SALES_DB` and on the schema `SALES_DB.MART` so the role can resolve the objects the tiles query; `SELECT` on the `ORDERS_SUMMARY` table or view so the tile queries can read its rows when the role runs them

    • A. A warehouse is needed to execute queries, so the role must be able to use one.
    • B. Ownership is not required to view and run a shared dashboard.
    • C. Tiles read data; they do not need permission to create tables.
    • D. Object resolution needs USAGE on both the containing database and schema.
    • E. Resizing is not needed to run tiles; USAGE is enough.
    • F. Tiles execute SELECT statements, so the role must hold SELECT on the object.

    Want the full experience?

    These are just samples. Practice the full Snowflake SnowPro Advanced: Data Analyst (DAA-C01) question bank in quiz mode — free, no signup, with domain practice and exam simulation.