Mode disclosure
All modes use one coherent workspace; only disclosure and guidance change. Learn mode keeps theory, concept names, full schema help, progressive hints, and solution review available.
Fan-Out, Pre-Aggregation, Self Joins, and Non-Equi Joins / guided completion
CH-E16 - insert one row and return generated/default fields
CH-E16 - insert one row and return generated/default fields. Detect independent one-to-many fan-out and pre-aggregate to a common grain.
- Result grain
- one row per product
- Exact columns
- product_id; product_name
SQL editor shortcuts: Ctrl or Command Enter runs the query, Ctrl or Command Shift Enter checks it, Alt H opens the next hint, Ctrl or Command slash toggles a line comment, Ctrl or Command Shift F formats the SQL, and Escape closes transient UI.
Cursor at line 1, column 1.
Scenario
Solve an unlabeled interview-style prompt with technique tags hidden until debrief.
Fan-Out, Pre-Aggregation, Self Joins, and Non-Equi Joins / guided completion
One-sentence task
CH-E16 - insert one row and return generated/default fields. Detect independent one-to-many fan-out and pre-aggregate to a common grain.
Learn mode disclosure
Theory, concept names, full schema help, and progressive hints are available.
Structured output contract
- Result grain
- one row per product
- Exact columns
- product_id; product_name
- Source population
- Use the prompt setup plus FROM, JOIN, WHERE, and subquery predicates as the source population. Visible rows are only examples.
- Grouping
- Do not collapse rows unless the contract explicitly asks for aggregation, distinct tuples, or set semantics.
- Ordering
- order by product_id ascending
- Validation
- select-only; hidden deterministic variants.
Relevant tables
Time and difficulty
- Estimated time
- 14 minutes
- Difficulty
- 4/5
Objective and concepts
State the requested SQL output contract for fan-out, pre-aggregation, self joins, and non-equi joins using source grain, columns, ordering, and edge-case evidence.
Glossary links
Concept material
SQL Trail treats every query as an evidence trail: identify source grain, transform rows deliberately, then compare output to a shared contract.
A passing query must handle hidden nulls, ties, boundaries, and no-match rows when the contract makes them relevant.
Syntax card
SELECT <requested_columns>
FROM <source_table>
WHERE <source_population_filter>
GROUP BY <result_grain_columns>
ORDER BY <deterministic_tie_breakers>;- <requested_columns> means the exact output columns, aliases, and order from the visible contract.
- <source_population_filter> means the row population definition, not a copied visible-row value.
- <deterministic_tie_breakers> means all ordering and tie rules needed for repeatable output.
Why this works
Joining two independent child collections through the same parent multiplies child counts before aggregation.
Edge cases
Hidden variants preserve nulls, ties, duplicates, boundaries, no-match rows, and alternate row order when those risks apply.
PostgreSQL note
The local engine uses PostgreSQL-compatible syntax, including explicit NULL predicates, deterministic ORDER BY clauses, and transactional grading.
Worked example
SELECT o.order_id, COUNT(DISTINCT oi.order_item_id)::int AS item_rows, COUNT(DISTINCT pay.payment_id)::int AS payment_rows, (COUNT(DISTINCT oi.order_item_id) * COUNT(DISTINCT pay.payment_id))::int AS naive_join_rows FROM orders o LEFT JOIN order_items oi ON oi.order_id = o.order_id LEFT JOIN payments pay ON pay.order_id = o.order_id GROUP BY o.order_id HAVING COUNT(DISTINCT oi.order_item_id) > 1 AND COUNT(DISTINCT pay.payment_id) > 1 ORDER BY o.order_id;Assumptions, dialect notes, and common traps
- Duplicate policy
- Preserve duplicate facts unless the prompt explicitly asks for distinct tuples or set semantics.
- Null policy
- Preserve NULL, empty string, zero, and false as distinct values unless the contract says to display a fallback.
- Tie-breakers
- Use every ordering rule in the contract and end tied business metrics with deterministic secondary keys when needed.
- Zero-related entities
- Do not invent zero rows unless the contract asks for preserved parents, missing entities, or complete periods.
- Numeric tolerance
- Use exact semantic comparison unless the activity explicitly declares a numeric tolerance.
PostgreSQL-compatible local checks
Queries run in a local PGlite worker with PostgreSQL-style syntax and transactional grading.
- Independent children multiply: Items and payments are joined directly and the resulting SUM looks plausible but repeats facts. Repair: Predict child-count multiplication and pre-aggregate each child collection to the parent grain.
- DISTINCT after SUM cannot repair fan-out: Repeated equal payment or item amounts are deduplicated instead of preserving real repeated facts. Repair: Stage facts at the correct grain before SUM rather than wrapping SUM inputs in DISTINCT.
- Self joins need role names: The same table is joined without clear aliases, making referred and referring customers interchangeable. Repair: Alias each table instance by its role and qualify every selected column.
- Range bands must not overlap: A boundary amount can match two bands or no band because both endpoints are inclusive. Repair: Use lower-inclusive and upper-exclusive predicates for adjacent ranges.
Opened hints
No hints opened yet.