Intermediate·35 min·Free
Trim padded customer codes without losing leading zeros, parse amounts exactly, reject timestamps without an offset, quarantine unknown customers, and keep the latest copy of each duplicated line.
- trimming
- type conversion
- quarantine
- lookups
- deduplication
Beginner·15 min·Free
Several systems sent the same account. Keep exactly one row per account using a stated tie-break order, and list every row you removed.
- deduplication
- tie-breaks
- timestamps
Beginner·10 min·Free
The same accented name arrives in two Unicode forms and padded with unusual spaces. Make equal names equal without stripping accents.
- Unicode
- trimming
- normalization
Beginner·15 min·Free
Look up each order's customer segment. A missing key must never match the customer row whose key is also missing.
- joins
- missing values
- trimming
Intermediate·15 min·Pro
Turn long readings into one row per entity with Jan, Feb and Mar columns. A reported zero is not the same as a month nobody reported.
- pivot
- missing values
- type conversion
Beginner·15 min·Free
Payments must point at a known account. Quarantine missing and unknown references with distinct reasons so every row is accounted for.
- lookups
- quarantine
- reconciliation
Intermediate·15 min·Pro
An order has several lines and each line has versions. Keep the latest version of every line, not one row per order.
- deduplication
- row grain
- type conversion
Beginner·10 min·Free
Mark sales above a review threshold instead of deleting them, and keep negative refunds as valid rows.
Intermediate·20 min·Free
03/04/2026 is March 4th in the US and 3 April in the UK. Parse slash dates only when the row says which convention it uses.
Intermediate·20 min·Pro
Amounts arrive as 1,234.50 or 1.234,50 or (12.50). Parse each by its declared locale, keep exact cents, and total each currency separately.
- decimals
- locales
- aggregation
- quarantine
Intermediate·15 min·Free
Three files share most columns. Stack the ones that match the schema, record which file each row came from, and reject a file that's missing a required column.
- combining files
- schemas
- lineage
Advanced·15 min·Pro
Fill missing test values with the median of the TRAINING data, flag every filled cell, and never let test values influence the fit.
- imputation
- leakage
- decimals
Intermediate·15 min·Free
Normalize timestamps to UTC, keep two different offsets on the same wall-clock time apart, and quarantine timestamps that never said which zone they're in.
- timestamps
- time zones
- quarantine
Beginner·8 min·Free
This system treats email addresses as case-insensitive. Trim and lowercase them — and do nothing else: dots and plus tags stay.
Beginner·15 min·Free
Support tickets name the same channel a dozen ways. Map them with the approved dictionary only, and quarantine anything the dictionary doesn't cover instead of guessing.
- mappings
- controlled vocabulary
- quarantine
- trimming
Intermediate·25 min·Free
An inventory feed has impossible quantities, zero prices and unknown countries. Apply the validation rules in order and report the first rule each row breaks.
- validation rules
- ranges
- type conversion
- allowed values
- quarantine
Intermediate·20 min·Pro
The CRM and the web shop both hold customer records. Merge records that share an email under a stated survivor rule, and send records you can't match safely to human review.
- entity resolution
- survivor rules
- normalization
- human review
Beginner·15 min·Free
Member IDs and postcodes have leading zeros that must survive, and the opt-in flag arrives as Y, yes, TRUE or 1. Parse the flag to a real boolean without guessing.
- identifiers
- booleans
- mappings
- type conversion
Intermediate·15 min·Free
A survey export has one column per question. Reshape it to one row per answer, and leave unanswered questions out rather than scoring them zero.
- unpivot
- missing values
- type conversion
- reshaping
Beginner·10 min·Free
A report needs every visit in a region bucket, so a missing region becomes "unknown". A missing duration is different: filling it with 0 would drag the average down.
- missing values
- filling
- blank text
- type conversion
Beginner·10 min·Pro
A sensor export writes -999 when no reading was taken. Treat that code and blanks as missing, keep real readings (including negatives), and quarantine anything that isn't a whole number.
- missing values
- sentinels
- type conversion
Beginner·10 min·Pro
Supplier records carry country codes typed by hand. Normalize them and accept only the five approved codes, reporting missing and unknown codes separately.
- validation
- allowed values
- text
Beginner·10 min·Pro
Support tickets use several spellings for priority, and some have none. Map the approved spellings, apply the documented default for missing priorities, and quarantine anything unmapped.
Beginner·10 min·Pro
The report covers EU orders only. Exclude other regions without reporting them as errors, then validate EU amounts and quarantine the ones that aren't exact two-decimal numbers.
- scope
- validation
- exact decimals
Intermediate·12 min·Pro
Order lines carry SKUs in mixed case with padding. Normalize them, attach the product name from the catalog, and report unknown SKUs and bad quantities instead of dropping them.
Intermediate·12 min·Pro
A price history has several rows per product. Validate prices, then keep the row that is current (latest valid_from, then smallest row_id) and report the rest as superseded.
- deduplication
- survivor rules
- dates
Beginner·10 min·Pro
Sign-up dates should be real ISO dates on or after the product launch. Report missing dates, impossible or wrongly formatted dates, and dates before launch separately.
Beginner·10 min·Pro
Invoice totals must be exact two-decimal amounts and never negative (credit notes come from another feed). Report missing, malformed and negative totals with separate reasons.
- exact decimals
- validation
- money
Intermediate·12 min·Pro
Summarize visit minutes by region, and report how many visits had a recorded duration so readers can judge the totals. Missing durations stay missing; malformed ones are reported.
- aggregation
- missing values
- coverage
Beginner·8 min·Pro
Validate order quantities and flag bulk orders (100 or more) for the warehouse, keeping every valid order in the output.
- flags
- validation
- thresholds
Beginner·8 min·Pro
Attach department titles to employees. A missing or unknown department is not an error here: keep the employee and leave the title missing.
Intermediate·12 min·Pro
Total expense amounts per category with exact decimals. Uncategorized expenses get their own group; malformed amounts are reported and left out of the totals.
- aggregation
- exact decimals
- categories
Beginner·10 min·Pro
Quarterly sales arrive with one column per quarter. Turn them into one row per store and quarter. A reported 0 is a real value; a missing quarter produces no row.
Beginner·8 min·Pro
A user export mixes real and test accounts, with the test flag written several ways. Keep real users only (test accounts are out of scope, not errors) and normalize their emails.
Intermediate·10 min·Pro
A device resends events when it loses its connection. Keep the first delivery of each event_id (earliest received instant, then smallest row_id) and report the resends.
- deduplication
- timestamps
- survivor rules
Beginner·8 min·Pro
US states arrive as codes or full names. Map the listed full names to their codes and keep every other value unchanged; this mapping only standardizes known variants and rejects nothing.
Beginner·10 min·Pro
Each payment needs an approved currency code and an exact amount. Check them in the declared order so every rejected payment has exactly one first reason.
- validation
- rule order
- exact decimals
Beginner·8 min·Pro
A contact needs a name and an email. Whitespace-only values count as missing. Report the first missing field in the declared order.
- required fields
- missing values
- rule order
Intermediate·10 min·Pro
Delivery times have a long tail. Report the median days per carrier (robust to extremes) with the number of deliveries, after rejecting malformed durations.
- aggregation
- robust statistics
- validation
Beginner·8 min·Pro
Phone numbers were filled with placeholders like N/A, none or a dash. Turn the listed placeholders into missing values and keep real numbers exactly as written.
- missing values
- placeholders
- text
Beginner·10 min·Pro
An event log has many events per person. Report daily active users: distinct people per day, not events, after normalizing user IDs and leaving out rows that can't be attributed.
- aggregation
- distinct counts
- dates
Beginner·10 min·Pro
Build a customer summary with the first and last order date and the number of orders. Only real dates may count, and missing and invalid dates are reported separately.
- dates
- aggregation
- validation
Intermediate·14 min·Pro
Build a Q1 store-by-month table. Several rows can share a store and month, so total them first; months outside Q1 are out of scope, and a store with no sales in a month stays missing, not zero.
Intermediate·10 min·Pro
Old category codes are retired. Translate them with the approved crosswalk table, keep the original code next to the new category so the mapping can be audited, and report missing and unmapped codes separately.
- mappings
- lookups
- traceability
Intermediate·12 min·Pro
Bookings must point to a room that exists and is open. Look each room up, use its state to validate the booking, and check the number of nights, reporting the first failing rule.
- joins
- validation
- ordered rules
Intermediate·12 min·Pro
An export glitch repeated some payment rows. Remove the copies (same payer, amount and time) but keep genuine repeat payments, comparing typed values so 12.5 and 12.50 count as the same amount.
- deduplication
- typed comparison
- timestamps
Beginner·10 min·Pro
Not every problem should block a row. A bad weight is an error and is quarantined; a missing tracking number is a warning: keep the shipment and flag it.
Beginner·10 min·Pro
A vendor file arrives with display-style headers. Map them to the warehouse schema, keep customer IDs as text (leading zeros matter), and give dates and amounts explicit types.
Beginner·10 min·Pro
A consent field mixes yes, no and 'unknown'. Map the answers to true and false, keep unknown and unasked as missing (never false), and quarantine values that aren't answers at all.
- booleans
- missing values
- mappings
Intermediate·12 min·Pro
The Q1 report covers 1 January to 31 March 2026. Rows outside the window are out of scope, rows whose date can't be read are errors, and amounts are validated only for rows in scope.
Intermediate·10 min·Pro
Colour codes pasted from a web page carry no-break and ideographic spaces that an ASCII trim can't see. Remove Unicode whitespace, then validate the codes against the approved list.
- unicode
- whitespace
- validation
Intermediate·10 min·Pro
Fuel prices are quoted per litre to four decimals. Keep that precision exactly, reject prices with more decimals instead of rounding them, and report the lowest and highest price per station.
- decimal precision
- aggregation
- validation
Intermediate·12 min·Pro
Don't merge customers automatically. Group records that share a normalized email into candidate groups for a person to review, listing the lowest record ID as the proposed master and how many records each group holds.
- entity resolution
- blocking
- aggregation
Intermediate·10 min·Pro
A temperature sensor can only measure -40 to 85 °C. Quarantine readings outside that physical range, but keep hot readings that are possible and flag them for attention instead of deleting them.
Intermediate·12 min·Pro
A nightly batch can contain orders that an earlier run already loaded. Skip those so re-running the load never inserts an order twice, then validate the amounts of the genuinely new orders.
- idempotence
- incremental loads
- joins
Intermediate·10 min·Pro
Account IDs are up to 19 digits. As floating-point numbers some of them become identical, so joining on numbers attaches the wrong plan. Match the IDs as text.
Beginner·10 min·Pro
Price is required for a product listing; weight is optional enrichment. A bad price quarantines the row, while an unreadable weight just becomes missing and the product stays.
- missing values
- field policies
- types
Intermediate·12 min·Pro
Contacts are duplicated by email. Keep the record that has a phone number; among those, the most recently updated one; then the smallest id. Report the others as merged duplicates.
- deduplication
- survivor rules
- completeness
Intermediate·14 min·Pro
Three store files arrive for one load. Stack the ones that match the schema, validate amounts, and produce a per-file load summary (rows loaded and total) so a rejected or short file stands out.
- combining files
- reconciliation
- schemas
Intermediate·12 min·Pro
The revenue report covers active customers only. An order for an unknown customer is an error, an order for a closed or trial customer is simply out of scope, and in-scope amounts must be positive.
Beginner·8 min·Pro
Before changing anything, measure how complete the file is: total rows and how many rows actually have an email, a phone and a birth date. Blank and whitespace-only cells don't count as present.
- profiling
- missing values
- aggregation
Beginner·8 min·Pro
Before mapping a status field, list every distinct normalized value with how often it occurs. Missing values are a value too: they get their own row instead of disappearing from the table.
- profiling
- group by
- missing values
Intermediate·12 min·Pro
Sales point to products, and products point to categories. Follow both links to attach the department, and report a sale whose product is unknown separately from one whose product points to a category that doesn't exist.
- joins
- referential integrity
- lookups
Intermediate·12 min·Pro
Two customer exports overlap: the latest export and an older archive. Stack them with lineage, keep one row per customer preferring the latest export, and keep customers that only exist in the archive.
- combining files
- lineage
- deduplication
Intermediate·10 min·Pro
A model needs a discount on every order, so missing discounts are filled with 0.00 — but only together with an indicator column, so analysts can tell a real zero from a filled one.
- imputation
- indicator columns
- analysis readiness
Beginner·8 min·Pro
An analytics partner needs city-level spend, not personal details. Deliver only the agreed columns — no names, emails or phones, not even in the exception report — with spend validated and city normalized.
- data minimization
- handoff
- validation
Intermediate·10 min·Pro
The device list was extracted on 30 June 2026. A last-seen date after the extract is impossible and quarantined; a date before 2026 is real but stale, so the device is kept and flagged.
Beginner·10 min·Pro
Discount rates must be stored as fractions between 0 and 1. A value like 15 is almost certainly a percent typed in the wrong unit: report it instead of dividing by 100 on a guess.
- units
- ranges
- decimal precision
Intermediate·10 min·Pro
In a contract list, an end date of N/A means the contract is open-ended, while a blank means nobody has entered it yet. Keep both as missing dates, but record the difference in an open_ended column.
Intermediate·12 min·Pro
Pick the best-selling product in each category with an explicit tie-break: highest units sold, then the smallest product ID. Products with unreadable sales can't compete.
- window functions
- ranking
- ties
Beginner·8 min·Pro
Find the highest invoice number per store. As text, 9 sorts after 10 and 0042 before 7, so the numbers must be compared as numbers after validation.
Intermediate·10 min·Pro
Coupon codes are case-sensitive: SAVE10 and Save10 are different coupons with different discounts. Trim the padding but don't change case, or redemptions get the wrong discount.
- text
- lookups
- over-normalization
Advanced·15 min·Pro
Product attributes are stored one per row (key-value). Keep the latest value of each attribute, then spread color, size and material into columns. Unknown attribute names are out of scope.
- pivot
- survivor rules
- reshaping
Intermediate·12 min·Pro
Build a mailing list that excludes everyone on the suppression list. The list contains blank rows, which silently empty a NOT IN query in SQL; exclude suppressed people without losing everyone else.
- anti-joins
- NULL semantics
- scope
Advanced·14 min·Pro
The March books closed at 2026-04-01 00:00 UTC. Postings stamped with other offsets must be compared as instants: 01:30 in Berlin on 1 April is still March, and 20:00 in New York on 31 March is already April.
- timestamps
- time zones
- scope
Intermediate·12 min·Pro
Two members called Lee Park may be different people. Merge records only when the normalized name AND the birth date agree, and keep same-name people with different birth dates apart.
- entity resolution
- composite keys
- false merges
Intermediate·10 min·Pro
A form stored a multi-select question as one checkbox column per channel. Turn it into one row per respondent and chosen channel; unticked boxes produce no rows.
- unpivot
- multi-select
- normalization
Intermediate·10 min·Pro
City names arrive from two systems: one writes ü as a single character, the other as u plus a combining mark. Normalize to NFC before looking cities up, without stripping the accents.
- unicode
- normalization
- lookups
Intermediate·12 min·Pro
Assign each person an age band using the approved band table (0–17, 18–34, 35–54, 55+). Edges are where binning code usually goes wrong, so 17, 18, 34, 35, 54 and 55 must land in the right band.
Intermediate·12 min·Pro
A sensor sheet has one column per day, so the dates live in the headers. Unpivot to one row per sensor and day, turn the header into a real date, and drop blank cells (no reading) while keeping zeros.
- unpivot
- headers as data
- dates
Beginner·8 min·Pro
This file was made by pasting several exports together, so header rows repeat in the middle and a TOTAL row sits at the end. Those rows aren't records: drop them before validating the real ones.
- import
- file structure
- validation
Beginner·8 min·Pro
For a channel report, map ticket sources with the approved table and put anything unmapped into an explicit other bucket — while keeping the normalized source next to it so the other bucket can be audited and the mapping extended.
- mappings
- reporting buckets
- traceability
Intermediate·10 min·Pro
Currencies were captured as symbols or codes. € and £ are unambiguous, but $ could be US, Canadian or Australian dollars. Map what is certain and send $ to review instead of guessing.
- mappings
- ambiguity
- validation
Intermediate·10 min·Pro
Total each player's points and deliver the leaderboard in a defined order: most points first, ties broken alphabetically by player. Here row order is part of the answer.
Intermediate·12 min·Pro
Build a team-by-status table of ticket counts. Unlike sums of unknown values, a count over no tickets really is 0, so empty cells are filled with 0 — a documented exception to 'missing is not zero'.
- pivot
- counting
- zero versus missing
Beginner·10 min·Pro
Orders carry the customer's name and the product table also has a name column. Bring in the product name under a new column name instead of overwriting the customer name or ending up with name_x and name_y.
- joins
- column naming
- pandas merge
Intermediate·10 min·Pro
A published table of residents per district must not show groups smaller than 5, because tiny counts can identify people. Count per district and publish only districts with at least 5 residents.
- privacy
- aggregation
- thresholds
Intermediate·12 min·Pro
Keep the latest status per account. Some rows have no usable timestamp; they may only survive when an account has no timed row at all. Be explicit about where missing values sort.
- deduplication
- NULL ordering
- timestamps
Beginner·8 min·Pro
Customers on the gold and platinum tiers get priority support. Normalize tiers through the approved mapping (plat is platinum), quarantine unknown tiers, and derive a priority_support flag from the list.
Intermediate·10 min·Pro
Report the average order value per channel, rounded to cents. Only valid amounts count: a missing or broken amount is excluded and reported, never treated as zero.
- aggregation
- averages
- rounding
Beginner·8 min·Pro
A CSV saved as 'UTF-8 with BOM' starts with an invisible U+FEFF, so the first header is U+FEFF followed by customer_id and code that names the column fails. Rename it and tidy the other fields.
Beginner·10 min·Pro
The membership system writes 1900-01-01 (and, in old records, 0001-01-01) when a birth date is unknown. Turn those placeholders into missing values before anyone computes ages, and quarantine real errors.
- missing values
- sentinels
- dates
Intermediate·12 min·Pro
Work out when each user session started and ended. Events were logged by servers in different time zones, so the earliest and latest event must be found by instant, not by the text of the timestamp.
- timestamps
- aggregation
- time zones
Advanced·14 min·Pro
Each auction lot has several bids. The winner is the highest valid bid; equal bids go to the one placed first (by instant), then the smallest bid ID. Every other bid on the lot is reported as outbid.
- survivor rules
- timestamps
- ties
Intermediate·10 min·Pro
Two branches send sales files with no row IDs. A sale of the same SKU and quantity on the same day in both branches appears as identical rows, and both are real. Stack the files and total units per SKU without collapsing them.
- combining files
- UNION ALL
- aggregation
Intermediate·10 min·Pro
Summarize a wide survey: for each question, how many respondents gave each answer. Unpivot first so the answers can be cleaned once, leave unanswered questions out, and count.
- unpivot
- aggregation
- normalization
Intermediate·10 min·Pro
Leave cancelled orders out of the report. In SQL, status <> 'cancelled' is not true for a missing status, so a careless filter also drops orders whose status is unknown. Label them unknown and keep them.
- NULL semantics
- scope
- filters
Intermediate·12 min·Pro
List the orders that are open right now. Each order has a status history, so first take each order's latest status and only then keep the open ones; filtering first would resurrect orders that have since closed.
- order of operations
- deduplication
- timestamps
Intermediate·10 min·Pro
A payment feed sometimes re-sends a payment. Revenue per merchant must count each payment once, so remove the resends (same payment_id) before summing — otherwise totals grow with every retry.
- deduplication
- aggregation
- reconciliation
Advanced·15 min·Pro
Turn an order event log into a milestone table: for each order, the first time it was placed, shipped and delivered. Repeated events (a second shipping scan) must not move a milestone, and an order that hasn't reached a step stays missing there.
- pivot
- aggregation
- timestamps
Intermediate·10 min·Pro
A satisfaction question is coded 1–5, with 8 for don't know and 9 for refused. Decode every answer with the codebook, but only 1–5 become a score: averaging an 8 or a 9 would invent satisfaction.
- codebooks
- missing values
- lookups
Intermediate·10 min·Pro
Deliver the support queue in its agreed order: unassigned tickets first, then by owner a to z, then oldest first. Missing owners must sort first, which is not every tool's default.
- sorting
- NULL ordering
- timestamps
Intermediate·10 min·Pro
Summarize product ratings with the median and the number of reviews. A median from three reviews isn't reliable, so flag products with fewer than 5 reviews instead of dropping them or pretending they're as solid as the rest.
- aggregation
- sample size
- flags
Intermediate·10 min·Pro
Summarize order lines per order: how many lines, whether ANY line is backordered and whether ALL lines have shipped. 'Any' and 'all' are different roll-ups of the same line-level facts.
Intermediate·12 min·Pro
A contact form stored up to three phone numbers in phone_1 to phone_3, and people often typed the same number twice. Produce one row per person and distinct phone, remembering the first slot it appeared in.
- unpivot
- deduplication
- multi-valued fields
Intermediate·12 min·Pro
Stores report revenue monthly. Pivot the Q1 reports and list the stores with no valid March report, with their January and February totals, so someone can chase them. A missing cell is the finding here.
- pivot
- completeness
- follow-up lists
Beginner·8 min·Pro
Produce the three headline numbers for a dashboard tile: valid orders, total revenue and the exact median order value. One row, computed only from amounts that pass validation.
- aggregation
- medians
- exact decimals
Intermediate·10 min·Pro
Invoices need the customer's billing email from the CRM. A customer that doesn't exist and a customer that exists but has no billing email are different problems with different owners, so report them separately.
- joins
- required fields
- referential integrity
Beginner·8 min·Pro
Stock movements use positive quantities for sales and negative ones for returns. The sales report includes only sales; returns belong to a different report and aren't errors. A quantity of zero is meaningless and is reported.
Intermediate·10 min·Pro
The company's fiscal year starts in April, so March 2026 belongs to FY25 Q4, not to calendar Q1. Map each month with the finance calendar table instead of computing quarters, then total revenue per fiscal quarter.
- calendars
- lookups
- aggregation
Intermediate·10 min·Pro
A country column mixes two-letter codes (DE) and three-letter codes (DEU). Translate both to the two-letter standard with the reference table, which lists every accepted code including the two-letter ones themselves.
Intermediate·12 min·Pro
Credit each customer's first marketing touch. Touches were logged in several time zones, so 'first' means the earliest instant; ties go to the smallest touch ID. Normalize channels and report touches without a usable time.
- attribution
- timestamps
- survivor rules
Intermediate·10 min·Pro
Prepare churn training data. A row without a known outcome can't teach the model anything, so it is quarantined; a missing feature is fine and stays missing for the model's own handling.
- machine learning prep
- booleans
- missing values
Beginner·8 min·Pro
For a forecasting model, test rows must come after training rows. Mark rows dated 2026-01-01 or later as test and earlier ones as train, instead of a random split that would leak the future into training.
- train/test split
- dates
- leakage
Intermediate·10 min·Pro
Report sellable units per SKU as of 2026-06-30. Batches that expired before that date aren't sellable (out of scope, not errors); batches whose expiry date can't be read are reported, because nobody knows if they're safe.
Intermediate·10 min·Pro
Revenue must be reported by region, but sales only carry a store code. Attach each store's region from the store table, report sales for unknown stores, and total revenue per region.
- joins
- aggregation
- dimensions
Beginner·8 min·Pro
Only adults may sign up. Instead of computing ages (and getting birthdays and leap years wrong), turn the rule into a cutoff: on 2026-06-30, adults were born on or before 2008-06-30.
- validation
- dates
- boundaries
Beginner·8 min·Pro
Total expenses per department, including expenses with no department. pandas groupby silently drops missing keys by default, so the report would no longer add up to the file; keep the missing group.
- group by
- missing values
- reconciliation
Beginner·10 min·Pro
A month column was typed as Mar, March, 03 or 3. Map every approved spelling to a two-digit month code, quarantine what isn't a month, and total units per month.
- mappings
- controlled vocabulary
- aggregation
Advanced·12 min·Pro
The product catalog keeps every price version with a valid_from date, including versions scheduled for the future. Report the price in force on 2026-06-30: ignore future versions, then keep the latest remaining one per SKU.
- as-of logic
- deduplication
- dates
Beginner·8 min·Pro
An order file was saved on Windows and read as if it came from Linux, so every value in the last column ends with an invisible carriage return. 'open\r' isn't 'open': strip the line-ending characters before validating statuses.
- import
- whitespace
- validation
Intermediate·10 min·Pro
Part codes pasted from documents contain en dashes and minus signs that look exactly like a hyphen. They are different characters, so those codes don't match the catalog. Report them instead of silently rewriting them.
Intermediate·12 min·Pro
The shop and the CRM give the same customer different keys. A crosswalk maps every source key to one master customer ID. Resolve orders through it before totalling, or one customer's revenue is split across two keys.
- entity resolution
- lookups
- aggregation
Intermediate·12 min·Pro
An incremental load picks up rows changed since the last run. The previous run's high-water mark is 2026-03-01 12:00 UTC: load rows updated strictly after that instant, compared as instants, so a row stamped 13:00+01:00 (the mark itself) isn't loaded twice.
- incremental loads
- timestamps
- boundaries
Intermediate·10 min·Pro
Member numbers passed through a spreadsheet, which wrote some as 1042.0 or 1.042E+03. Those are float artefacts: digits may already be lost, so they are reported for re-export instead of being 'fixed' by converting through a float.
- identifiers
- types
- spreadsheets
Beginner·10 min·Pro
Three regional files should stack into one table, but the north export still calls the amount column amt. Rename it first — it is the same field — instead of letting the schema check reject the whole north file.
- combining files
- schemas
- lineage
Intermediate·10 min·Pro
Pick each customer's contact number from three columns in a stated order of preference: mobile, then landline, then work phone. Whitespace-only cells count as empty. This is COALESCE — and the order of its arguments is the business rule.
- coalesce
- missing values
- priority rules
Intermediate·12 min·Pro
Keep each person's earliest sign-up row, whole. pandas groupby().first() takes the first non-missing value of each column separately, stitching together a record that never existed. If the earliest row has no phone, the result has no phone.
- pandas
- duplicates
- survivor rules
Intermediate·10 min·Pro
Daily order counts spike on some days. Flag days with 500 or more orders and attach the event from the marketing calendar, so a Black Friday peak is explained and an unexplained spike stands out. Nothing is removed.
Beginner·8 min·Pro
A web form exports a checkbox as 'on' when ticked and nothing when unticked. For the optional newsletter box, blank therefore means false — a documented exception to 'missing is unknown'. For the required terms box, blank means not accepted.
- missing values
- booleans
- documented defaults
Intermediate·10 min·Pro
Somewhere upstream, UTF-8 text was decoded as Windows-1252, so München became München. Apply the approved repair list, then validate cities against the reference table. Garbled values that aren't on the list are reported, not re-decoded on a guess.
- encoding
- mappings
- validation
Intermediate·10 min·Pro
Deliver a staff directory sorted by name in Unicode code point order, ties by id. That order puts Zoe before adam and émile after zack. Normalize accents to one form first, or the same name sorts in two places.
Beginner·10 min·Pro
Count members per household, where a household is a normalized postcode plus address. '12 High St' and ' 12 high st' at 'ab1 2cd' are the same household; people without a complete address can't be placed and are reported.
- entity resolution
- normalization
- aggregation
Beginner·8 min·Pro
The accounts table keeps deleted accounts and marks them with a deleted_at value. Every downstream query must leave them out — as out of scope, not as errors — and validate only live accounts.
- scope
- soft deletes
- validation
Intermediate·10 min·Pro
A lab result column holds numbers and the code <LOD (below the limit of detection). That's two meanings in one text column: split it into a typed number and a true/false flag, instead of turning <LOD into 0 or throwing it away.
Advanced·14 min·Pro
The German office sends 1.234,50 and the US office sends 1,234.50. After stacking the files, parse each amount with its file's separators: in the German file 12.500 is twelve thousand five hundred, in the US file 1.234 has too many decimals.
- combining files
- number formats
- lineage
Intermediate·12 min·Pro
List repeat customers: people with at least two paid orders, and what they spent. Unpaid orders must be removed before counting (WHERE), and customers with fewer than two paid orders after counting (HAVING). Doing either at the wrong stage changes who qualifies.
- aggregation
- where vs having
- scope
Intermediate·10 min·Pro
Children per household is optional: blank means not answered, not 0. In pandas a whole-number column with a gap becomes float (2.0, NaN) unless you use the nullable Int64 type, and the contract asks for whole numbers.
- pandas
- types
- missing values
Beginner·8 min·Pro
Self-reported task times cluster on 30, 60, 90 and 120 minutes — the numbers people type when they estimate. Flag those as likely estimates so analysts can weigh them, while keeping every valid entry.
Intermediate·12 min·Pro
Each invoice is split across departments by percentage. Every line can be valid on its own while the invoice is not: 60% + 50% is 110%. Validate the lines, then report the invoices whose allocations don't total exactly 100.
- validation
- aggregation
- group rules
Intermediate·10 min·Pro
Blog tags were typed on phones and pasted from the web: Café, café with a combining accent, café padded with a no-break space. Count uses per tag after Unicode trimming, NFC and lower case, so one tag isn't split into three rows.
- unicode
- normalization
- aggregation
Intermediate·10 min·Pro
Before trusting a customer match, measure it: for each source system, how many records found a CRM customer by email. Missing emails can't match anything — not even the CRM row whose email is also missing.
- entity resolution
- quality metrics
- joins
Intermediate·12 min·Pro
A customer tier table keeps history: closed rows have a valid_to date and the current row has none. Take the current rows only, and when a customer has two open rows (a load bug), keep the latest one and report the other.
- history tables
- scope
- duplicates
Intermediate·12 min·Pro
Three country files have an amount column but no currency column: the UK file is in GBP, the US file in USD, the EU file in EUR. Stack them, turn the file name into a currency, and total per currency — never across currencies.
- combining files
- lineage
- currency
Beginner·8 min·Pro
Two exports have the same columns in a different order. SQL's UNION ALL matches columns by position, so SELECT * from both puts regions into the id column without any error. Stack by name, then validate.
- union
- schemas
- combining files
Beginner·8 min·Pro
Keep only active users. The active column is text — 'true', 'False', ' TRUE ' — and in Python any non-empty string is truthy, so astype(bool) keeps everyone. Parse the text into real booleans first.
Beginner·8 min·Pro
Ledger entries carry a direction (debit or credit) and a positive amount. A negative or zero amount is invalid here, because the direction already says which way money moved — a negative credit would flip it twice.
Intermediate·12 min·Pro
List the contracts active on 2026-06-30. A contract with no end date is still running, so 'end on or after the as-of date' must count a missing end as the far future, not as a failed comparison that drops the contract.
- dates
- intervals
- missing values
Intermediate·12 min·Pro
Deliver stock sorted by SKU and then by size from small to large. Sorted as text, sizes come out L, M, S, XL. Map the spellings to standard sizes, look up each size's rank, and sort by the rank.
- ordinal categories
- mappings
- sorting
Beginner·8 min·Pro
Before choosing a date rule, measure: for each source system, how many rows there are and how many event dates are valid ISO dates. A source that sends 03/04/2026 will stand out — and nothing is changed or quarantined yet.
Beginner·8 min·Pro
A freezer log records temperatures from -50 to 60 °C. 0 and 0.0 are real readings, not missing values — but code that tests 'if value' or uses NULLIF(x, 0) quietly turns them into gaps.
- validation
- zero vs missing
- ranges
Intermediate·10 min·Pro
Deliver an audit log sorted by when things happened. Entries were stamped in different time zones, so sorting the text puts 09:30-05:00 before 12:00Z although it happened later. Sort by instant, ties by id.
- timestamps
- sorting
- delivery
Advanced·14 min·Pro
Orders arrive from shops in several countries, and slash dates follow each country's convention: 04/03/2026 is 4 March in the UK and April 3rd in the US. Look up each country's date order, then parse with it.
Beginner·8 min·Pro
Three weekly extracts should each cover one week. Before combining them, profile each extract: row count, how many rows have a usable date, and the first and last date. An extract that stops early or overlaps the next one shows up immediately.
Intermediate·10 min·Pro
Employees point at their manager by employee id, in the same table. Attach each manager's name by looking the table up in itself — joining in the right direction — and report managers that don't exist. The CEO is their own manager.
- self joins
- lookups
- referential integrity
Intermediate·10 min·Pro
Each flight has an origin and a destination airport, and both are looked up in the same airport table. Join it twice under different names, so the origin city and the destination city end up in separate columns, and report each kind of unknown airport separately.
Intermediate·10 min·Pro
Report March refunds as one row: how many and how much. Some months have no refunds at all. SQL's SUM over no rows is NULL, not 0, so the dashboard would show a blank instead of 'no refunds'. The total of nothing is 0.00.
Intermediate·10 min·Pro
The warehouse column is decimal(10,2): at most 8 digits before the point. An amount of 123456789.00 doesn't fit and is reported — not truncated, not stored as a float, and not silently turned into NULL without a reason.
Intermediate·12 min·Pro
Compute the conversion rate per channel. Encode converted as 1 and not converted as 0, and the rate is simply the mean. Visits with an unknown outcome are left out of both the numerator and the denominator, not counted as failures.
Beginner·8 min·Pro
A model needs the acquisition channel as three true/false columns: is_email, is_search and is_social. An unknown channel must be reported, not silently encoded as all-false, which the model would read as a fourth, made-up category.
- machine learning prep
- encoding
- categories
Intermediate·10 min·Pro
A model was trained on a fixed list of cities. New rows to score include cities it never saw, and some have no city. Map anything outside the training list — and missing values — to 'other', exactly as training did, so the model never meets an unknown value.
- machine learning prep
- categories
- lookups
Intermediate·12 min·Pro
Build order-history features for a model that predicts from 2026-01-01. Only orders dated strictly before that day may count; an order on or after it is the future the model is trying to predict, and using it would leak the answer.
- feature engineering
- leakage
- aggregation
Beginner·8 min·Pro
A contact handoff has optional nickname and phone fields. Downstream systems test for missing values, so an empty or whitespace-only field must be delivered as missing — not as an empty string, which looks the same in a spreadsheet and breaks the receiving system's checks.
- delivery
- missing values
- text
Intermediate·12 min·Pro
A sheet has one row per store and one column per month. To total each month across stores, reshape to one row per store and month first. Blank cells are months a store didn't report: they are skipped, counted as missing coverage, never as 0.
- unpivot
- aggregation
- coverage
Advanced·14 min·Pro
A reporting tool wants metrics as rows (metric, value), not as one wide row. Compute the total, mean and median order value from valid amounts, then unpivot the three numbers into rows — all with the same type and 4 decimals, so they can share one value column.
Intermediate·10 min·Pro
Quantities typed on a Japanese keyboard arrive as full-width digits like 12. The order system stores ASCII digits only, so they are reported for correction. Watch out: Python's int() and \d accept them silently.
Intermediate·10 min·Pro
Remove duplicate contacts that share an email and a phone. Many contacts have no phone, and two rows with the same email and no phone are duplicates too: GROUP BY and PARTITION BY treat missing values as one group, but a self-join on phone = phone never matches them.
Beginner·8 min·Pro
The warehouse sends a full stock snapshot every day. Yesterday's and today's files both list every SKU, so stacking them doubles the stock. Stock as of 30 June comes from the 30 June snapshot alone.
- combining files
- snapshots
- grain
Intermediate·10 min·Pro
A load log records every successful load per source. For the 30 June check, report each source's number of loads and latest load instant, and flag sources whose latest load is before 2026-06-29 00:00 UTC as stale. Compare instants, not timestamp text.
- monitoring
- timestamps
- aggregation
Intermediate·12 min·Pro
Some March events only reached the warehouse in April, and some February events were loaded in early March. The March report is about when things happened: filter on event_at (as instants, in UTC), not on loaded_at.
- timestamps
- periods
- late data
Intermediate·10 min·Pro
Enrich order lines with the product's price and status. A product that has since been discontinued still existed when it was ordered, so those orders stay — flagged, not rejected. Only SKUs the catalog has never heard of are errors.
Advanced·14 min·Pro
A change feed lists inserts (I), updates (U) and deletes (D) with a sequence number. The current state of each key is its highest-numbered change — compared as a number, so 10 comes after 9 — and a key whose last change is a delete no longer exists.
- change data capture
- duplicates
- ordering
Advanced·18 min·Pro
Turn raw timesheet entries into payroll hours per team: resolve each employee's team, validate the day and the hours, keep only the latest resubmission for each employee and day, and only then total. Every rejected row carries one reason.
- pipelines
- lookups
- duplicates
- aggregation
Intermediate·10 min·Pro
Report, per survey question, how many respondents were asked and how many answered. Reshaping to long form must keep the unanswered cells: DuckDB's UNPIVOT drops NULLs by default, which would make every question look 100% answered.
- missing values
- unpivot
- rates
Intermediate·12 min·Pro
Quantities come with units typed freely: kg, KGS, kilogram, g, grams, litre, pcs. Map the approved spellings to four unit codes, report units nobody approved, and total quantities per unit — never adding kilograms to grams.
Intermediate·12 min·Pro
People can resubmit a form, and only their last submission counts. Identify a person by normalized email within each form, compare submission times as instants across offsets, and report earlier submissions as replaced.
- duplicates
- timestamps
- composite keys
Beginner·8 min·Pro
Shelf prices are normally between 1 and 100. A price of 1299 is most likely 12.99 typed in cents, but it could be a real premium item, so flag it for review instead of dividing by 100 or deleting it.
Beginner·8 min·Pro
Before applying a mapping dictionary, find out what it misses: the normalized values that have no entry, with how often each occurs. Missing values get their own row. The output is the to-do list for whoever maintains the dictionary.
- inspection
- mappings
- profiling
Beginner·8 min·Pro
An inventory export has blank aisles on some rows. In a printed report, a blank often means 'same as above', but this export's row order is arbitrary, so the row above says nothing about the aisle. Report the blanks instead of filling them down.
- missing values
- row order
- validation
Intermediate·10 min·Pro
Find the latest release of each app. A version is major.minor.patch, compared part by part as whole numbers: 1.10.0 is newer than 1.9.4, and 2.0.10 is newer than 2.0.9, although text comparison says the opposite.
- types
- sorting
- survivor rules