Deduplicate CRM Contacts

SQL practice question · Hard · Data Cleaning · Accenture, Deloitte

A client migration needs one row per real person. Clean email = LOWER(TRIM(email)), treated as missing when NULL or blank. Clean phone = the digits of phone only (drop spaces, '+', '-', '(', ')', '.'), keeping the LAST 10 digits; missing when no digits. Identity key: the clean email if present; otherwise the clean phone; otherwise the contact is unique on its own. Within each identity keep the row with the latest updated_at (tie: larger contact_id). Return contact_id, full_name (TRIM), clean_email and clean_phone (NULL when missing). Order by contact_id.

Table: crm_contacts

Schema of crm_contacts
ColumnType
contact_idINTEGER
full_nameTEXT
emailTEXT
phoneTEXT
updated_atTIMESTAMP
Sample rows of crm_contacts
contact_idfull_nameemailphoneupdated_at
1Rohit SharmaRohit.S@Mail.com+91 98290-111112026-01-10 10:00:00
2Rohit Srohit.s@mail.com 98290111112026-02-01 09:00:00
3Neha GuptaNULL(982) 902-22222026-01-05 08:00:00
4Neha G.+91-98290222222026-01-20 08:00:00
5Arjun Raoarjun@corp.in98290333332026-01-15 12:00:00
6Meena IyerNULLNULL2026-01-01 00:00:00
Expected output on the sample data
contact_idfull_nameclean_emailclean_phone
2Rohit Srohit.s@mail.com9829011111
4Neha G.NULL9829022222
5Arjun Raoarjun@corp.in9829033333
6Meena IyerNULLNULL

Solve it in the live editor on this page — run on sample data, then submit against hidden tests.

‹ Parse Error Logs by Module · Normalise Messy Expense Claims ›

T
Tech Town
Log InSign Up Free
Home SQL Python DSA Power BI Snowflake Databricks Spark Gen AI Practice Problems Contest Question Asked in Interview Blog
SQL Interview Practice

Company-wise SQL questions

{{ totalCount }} questions in the style asked at Amazon, Microsoft, Google, Meta, Flipkart and more — {{ hardPct }}% Hard. Write SQL in a real database engine in your browser, run it on sample data, then evaluate against hidden tests.

🏆 Weekly SQL Contest
{{ totalCount }}
Questions
{{ companyCount }}
Companies
{{ prog.total.solved }}
Solved
Bookmark Question Companies Difficulty Category Status
{{ r.n }} - {{ r.title }} {{ c }} {{ r.difficulty }} {{ r.category }} {{ r.statusIcon }}
No questions match these filters.
Showing {{ rangeLabel }} of {{ filteredCount }}

Company tags show where this type of question is commonly reported in interviews. Questions, data and solutions are written by TechTown.

← All questions

{{ cur.n }} - {{ cur.title }}

🏆 Contest {{ contestWeek }}
{{ cur.catLabel }} {{ cur.diffLabel }} {{ c }}
Embed this questionPaste on a blog, course page or LMS. Free to use — educator guide
{{ embedCode }}

{{ cur.statement }}

Table: {{ tb.name }}
ColumnType {{ c.name }}{{ c.type }}
{{ h }} {{ v.text }}
Expected output on the sample data:
{{ h }} {{ v.text }}
  • {{ h }}

No submissions yet. Press Evaluate to submit your query.

{{ s.verdict }} {{ s.meta }}
The solution unlocks after you solve this question or after 3 evaluations that didn't pass ({{ failCount }}/3 so far). Trying first is the fastest way to learn.
{{ solutionSql }}
  1. {{ e }}
⏱ {{ timerLabel }}
{{ fnHelpTitle }}
{{ fnHelpText }}
Writing {{ dialectName }} · Ctrl/Cmd + Enter runs the query · Tab indents · your code is saved automatically
Output {{ out.status }}
  • {{ w }}
{{ out.verdict }}
{{ out.detail }}
{{ out.error }}
Expected (sample data)
{{ h }}{{ v.text }}
Your output (sample data)
{{ h }}{{ v.text }}
{{ h }} {{ v.text }}
Run your query to see the result here.
🔒

To Track Your Progress, Log In / Sign Up

You have solved your 3 free questions — nice work! Log in (free) to unlock all 150 questions, keep your streak and appear on the leaderboard.

Sign Up Free Log In