Skip to content

Citi Data Analytics Interview Questions & Answers

Curated interview practice questions with answers. These are practice scenarios, not a verified list of past interview questions.

About Citi hiring for Data Analytics roles

Citi is a global bank serving corporations, institutions and individuals through services, markets, banking and wealth businesses. Its India technology and operations centres in Pune, Chennai and Mumbai support global functions. It hires for software engineers, QA engineers, data engineers, data analysts and risk analysts.

For Data Analytics roles, this Citi practice set focuses most on SQL (8), Power BI (6), Statistics and Case Studies (5), Python for Analysis (5). It has 4 easy, 33 medium, 3 hard questions, so you can start easy and work up to the harder ones.

Company type
Banking & finance
Headquarters
New York, USA
Main India offices
Pune, Chennai, Mumbai, Bengaluru, Gurugram

Citi Data Analytics interview process

  1. Online assessment (aptitude + coding)
  2. Technical round 1
  3. Technical round 2
  4. Managerial round
  5. HR round

Typical pattern based on public candidate experiences. Rounds vary by role, team and year.

Solved for CitiStart practicing
3 QUESTIONS FREESign up to unlock the full question bank and track your progress.Unlock every question and answer, then continue practising company-wise and package-wise.
3 questions free Unlock the rest in seconds
01

Why do ratio metrics need extra care on a dashboard compared with count metrics?

Save to ▾
Show answer
A ratio like conversion rate or average order value can move because the numerator or the denominator changed, so always show both components nearby. Ratios can look dramatic on small bases, such as 2 of 4 users. They also cannot be averaged across segments; you must divide total numerator by total denominator, otherwise small segments get too much weight. Counts are simpler but need context like trends or targets.
02

Write SQL using LAG to compare each month's revenue with the previous month.

CitiSQLMedium
Save to ▾
Show answer
WITH monthly AS ( SELECT DATE_TRUNC('month', order_date) AS month, SUM(amount) AS revenue FROM orders GROUP BY 1 ) SELECT month, revenue, LAG(revenue) OVER (ORDER BY month) AS prev_revenue, ROUND(100.0 * (revenue - LAG(revenue) OVER (ORDER BY month)) / NULLIF(LAG(revenue) OVER (ORDER BY month), 0), 1) AS mom_pct FROM monthly ORDER BY month;
03

SUMIFS vs COUNTIFS?

Save to ▾
Show answer
SUMIFS adds values that meet several conditions; COUNTIFS counts rows that meet several conditions. Example: =SUMIFS(Sales, Region, "North", Month, "Jan")
04

What is hypothesis testing in simple words?

Save to ▾
Show answer
You assume no effect (null), collect evidence and decide whether the data is surprising enough to reject that assumption at a chosen significance level.
05

A junior analyst wants to load one huge flat table with every column into Power BI instead of a star schema. How do you advise them?

Save to ▾
Show answer
A flat table is quick to start and fine for a small one-off analysis. But at scale it bloats the model because repeated text attributes compress poorly, makes DAX filters and time intelligence harder, and breaks when you add a second fact like targets or returns. I would show them a star schema with one fact and a few dimensions, compare model size and measure speed, and let the results convince them.
06

A measure shows correct values per row in a table visual, but the grand total looks wrong. Why, and how do you fix it?

Save to ▾
Show answer
Totals in DAX are not the sum of visible rows; the measure is recalculated in the total's filter context. A measure like a distinct count, a ratio or an IF condition can give a different result at total level. If the business wants the sum of row values, iterate explicitly, for example SUMX ( VALUES ( Product[Name] ), [My Measure] ). Confirm with stakeholders which total is correct before changing it.
07

Your pandas script shows SettingWithCopyWarning and a new column does not update. What is happening and how do you fix it?

Save to ▾
Show answer
It warns that you may be modifying a temporary copy of a slice, so the change might not reach the original DataFrame, for example df[df.sales > 0]['flag'] = 1. Avoid it by using a single loc call, df.loc[df.sales > 0, 'flag'] = 1, or by calling .copy() when you intentionally create a new subset. Newer pandas versions with copy-on-write make behaviour more predictable, but clear loc assignments remain best practice.
08

How do you declutter a chart?

Save to ▾
Show answer
Remove everything that does not help the message: heavy gridlines, borders, background colour, 3D effects, redundant legends and too many decimal places. Label data directly instead of using a legend, sort bars meaningfully, round numbers, and use one highlight colour with grey for the rest. Shorten axis labels and keep consistent fonts. Ask whether removing each element would lose information; if not, remove it.
09

Write SQL to calculate daily active users and the DAU/MAU stickiness ratio.

Save to ▾
Show answer
WITH dau AS ( SELECT CAST(event_ts AS DATE) AS day, COUNT(DISTINCT user_id) AS dau FROM events GROUP BY CAST(event_ts AS DATE) ) SELECT d.day, d.dau, (SELECT COUNT(DISTINCT e.user_id) FROM events e WHERE CAST(e.event_ts AS DATE) BETWEEN d.day - INTERVAL '29 days' AND d.day) AS mau, ROUND(100.0 * d.dau / (SELECT COUNT(DISTINCT e.user_id) FROM events e WHERE CAST(e.event_ts AS DATE) BETWEEN d.day - INTERVAL '29 days' AND d.day), 1) AS stickiness_pct FROM dau d ORDER BY d.day;
10

How do you improve Power BI report performance?

Save to ▾
Show answer
Use a star schema, remove unused columns, prefer measures, reduce visuals per page, limit high-cardinality fields and use aggregations or incremental refresh.
11

How do you find duplicate rows in a table?

CitiSQLMedium
Save to ▾
Show answer
SELECT col, COUNT(*) FROM t GROUP BY col HAVING COUNT(*) > 1; use ROW_NUMBER() partitioned by the key to delete extras.
12

What is the difference between a calculated table in DAX and a table created in Power Query?

Save to ▾
Show answer
A Power Query table is built during data refresh using M, before data enters the model, and is compressed like any imported table. A DAX calculated table is computed after load from other model tables, using functions such as CALENDAR, SUMMARIZE or DISTINCT. Prefer Power Query for shaping and cleaning source data. Use calculated tables for model-dependent needs, such as a date table from existing data or a small what-if table.
13

How do you handle a dataset with 30% missing values in a key column?

Save to ▾
Show answer
Understand why it is missing, consider imputation or a missing flag, test sensitivity, and talk to data owners about fixing collection if it is systematic.
14

Write SQL to find the median order value overall and per city.

CitiSQLMedium
Save to ▾
Show answer
-- Works in PostgreSQL, Snowflake, SQL Server (with OVER for SQL Server) SELECT city, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY order_value) AS median_value, AVG(order_value) AS mean_value FROM orders GROUP BY city ORDER BY median_value DESC;
15

What is columnar storage and why do analytical warehouses use it?

Save to ▾
Show answer
Columnar storage keeps all values of one column together on disk instead of storing full rows together. Analytical queries usually read a few columns across millions of rows, so the engine reads only those columns. Similar values sit side by side and compress very well, which cuts storage and scan cost. The trade-off is slower single-row inserts and updates, which is why OLTP databases stay row-based.
16

After joining orders to payments, your revenue total doubles. What went wrong?

CitiSQLMedium
Save to ▾
Show answer
This is a join fan-out: an order has more than one matching payment row, for example split payments or retries, so each order line is repeated and sums are inflated. Check by counting rows per key on both sides. Fix it by aggregating payments to one row per order before joining, joining at the correct grain, or using the right key. Always compare row counts and totals before and after a join.
17

A file has dates in mixed formats, some dd/mm/yyyy and some mm/dd/yyyy. How do you handle it?

Save to ▾
Show answer
Find out which system or region produced each format, since a source column often explains it. Values with a day above 12 reveal the format unambiguously. Parse with an explicit format per source, for example pd.to_datetime(col, format='%d/%m/%Y', errors='coerce'), rather than letting the tool guess. Check failed or suspicious parses, such as future dates, and ask the source team to send ISO format yyyy-mm-dd going forward.
18

During a review, an executive asks a question about your numbers that you cannot answer on the spot. What do you do?

Save to ▾
Show answer
Do not guess. Say clearly that you do not have that cut ready, restate the question to confirm it, and give a time by which you will reply, for example by end of day. If you know a partial answer or a reasonable expectation, share it with a caveat. Then follow up on time with a short, precise answer. Being honest and reliable builds more trust than a confident wrong number.
19

What is the unit of randomisation in an experiment, and how do you choose it?

Save to ▾
Show answer
The unit of randomisation is what gets assigned to control or treatment: a user, a session, a device, a store or a city. Usually it should be the user, so one person always sees the same version. Session-level randomisation can show one user both versions and contaminate results. Your analysis unit should match it; if you randomise by user but analyse per page view, standard errors become too small.
20

Estimate how many cups of tea are sold in a city of 1 crore people in a day.

Save to ▾
Show answer
State assumptions clearly. Of 1 crore people, assume 70 percent drink tea, so 70 lakh. Say half of their cups are bought outside, at an average of one bought cup per drinker every day for that half, giving about 35 lakh purchased cups, with more at offices and stations. So roughly 30 to 40 lakh cups. Interviewers judge the structure, segmentation and sanity check more than the exact number.
21

What is a CTE and why use it?

CitiSQLMedium
Save to ▾
Show answer
A Common Table Expression is a named temporary result defined with WITH that makes complex queries readable and allows recursion.
22

Users say a Power BI report still shows yesterday morning's data, although a refresh is scheduled every few hours. What do you check?

Save to ▾
Show answer
Open the semantic model's refresh history in the Service to see whether refreshes failed, for example due to expired credentials, an offline gateway or a timeout. Check whether the report is connected to a different copy of the model, whether the source itself was updated, and whether incremental refresh only covers some partitions. Also confirm the schedule time zone. Finally, add a 'data as of' timestamp on the report.
23

Write a DAX measure for cumulative sales from the start of the data to the selected date.

Save to ▾
Show answer
Cumulative Sales = VAR maxDate = MAX('Date'[Date]) RETURN CALCULATE( [Total Sales], FILTER(ALL('Date'[Date]), 'Date'[Date] <= maxDate) ) -- for a running total that resets each year use TOTALYTD([Total Sales], 'Date'[Date])
24

Write an Excel formula to put invoices into ageing buckets (0-30, 31-60, 61-90, 90+ days).

Save to ▾
Show answer
-- C2 = invoice date, TODAY() = as-of date =LET(age, TODAY()-C2, IFS(age<=30, "0-30", age<=60, "31-60", age<=90, "61-90", TRUE, "90+")) -- then a PivotTable with bucket in rows and SUM of amount gives the ageing report
25

Explain Matplotlib vs Seaborn.

Save to ▾
Show answer
Matplotlib is the low-level plotting library with full control; Seaborn builds on it with attractive statistical charts and simpler syntax.
26

What is referential integrity and how do orphan records appear in analytics data?

Save to ▾
Show answer
Referential integrity means every foreign key value points to an existing row in the parent table, for example every order's customer_id exists in customers. Orphan records break this rule. They appear when source systems load tables at different times, records are deleted without cascading, or IDs are formatted differently across systems. Detect them with a LEFT JOIN where the parent key is NULL, and decide whether to fix, map or flag them.
27

What is the difference between a data warehouse, a data lake and a lakehouse?

CitiSQLMedium
Save to ▾
Show answer
A data warehouse stores cleaned, structured data in modelled tables optimised for SQL reporting. A data lake stores raw data of any type, such as logs, JSON and images, cheaply in files, with structure applied when read. A lakehouse combines them: open table formats on lake storage add transactions, schemas and fast SQL on top of files. Analysts typically query the warehouse or the curated layer of a lakehouse.
28

Write SQL to find the number of days between each customer's consecutive orders and their average gap.

CitiSQLMedium
Save to ▾
Show answer
WITH gaps AS ( SELECT customer_id, order_date, order_date - LAG(order_date) OVER ( PARTITION BY customer_id ORDER BY order_date) AS days_since_prev FROM orders ) SELECT customer_id, COUNT(*) AS orders, AVG(days_since_prev) AS avg_gap_days FROM gaps GROUP BY customer_id HAVING COUNT(*) > 1; -- order_date is DATE (PostgreSQL); use DATEDIFF in other databases
29

What is the Central Limit Theorem and why does it matter for analysts?

Save to ▾
Show answer
The Central Limit Theorem says that the distribution of sample means approaches a normal distribution as sample size grows, usually from about 30 observations, even if the underlying data is skewed. This is why we can use z-tests, t-tests and confidence intervals for averages such as order value or session time. It does not make the raw data normal, and very heavy-tailed data may need larger samples.
30

How do you connect Python to a SQL database?

Save to ▾
Show answer
Create an engine with SQLAlchemy or a driver such as psycopg2, then run pd.read_sql(query, engine) to load results into a DataFrame.
31

Write pandas code to extract month name, weekday and hour from a timestamp column.

Save to ▾
Show answer
df['ts'] = pd.to_datetime(df['ts'], errors='coerce') df['month'] = df['ts'].dt.month_name() df['weekday'] = df['ts'].dt.day_name() df['hour'] = df['ts'].dt.hour df['is_weekend'] = df['ts'].dt.dayofweek >= 5 # orders by weekday print(df['weekday'].value_counts())
32

Your FILTER formula shows #SPILL! instead of results. Why, and how do you fix it?

Save to ▾
Show answer
Dynamic array formulas such as FILTER, UNIQUE and SORT return several values that spill into neighbouring cells. #SPILL! appears when that spill range is blocked by existing data, merged cells, or when the formula sits inside an Excel Table, which does not allow spilling. Fix it by clearing the blocking cells, unmerging, or moving the formula outside the Table. Select the error cell to see the dashed border of the range it needs.
33

What is the difference between melt and pivot?

Save to ▾
Show answer
melt converts wide data to long format; pivot converts long data to wide, and they are used to reshape data for analysis or charts.
34

Your event logs store timestamps in UTC, but the business reports daily sales in IST, and late-night orders land on the wrong day. How do you fix it?

Save to ▾
Show answer
Convert timestamps to the business time zone before deriving the date. IST is UTC plus 5 hours 30 minutes, so an order at 20:00 UTC belongs to the next day in IST. In SQL use AT TIME ZONE or CONVERT_TZ, and in pandas use tz_localize('UTC') followed by tz_convert('Asia/Kolkata'). Store raw UTC, add a local date column in the model, and document which one each report uses.
35

What is the difference between mean and median for reporting salaries?

Save to ▾
Show answer
Salaries are right-skewed, so the median better represents the typical employee while the mean is pulled up by a few high earners.
36

What is an enterprise bus matrix?

Save to ▾
Show answer
A bus matrix is a planning grid with business processes as rows, such as orders, shipments and returns, and conformed dimensions as columns, such as date, customer, product and warehouse. A tick shows which dimensions each process uses. It helps prioritise which fact tables to build, shows which dimensions must be shared and conformed first, and gives leaders a one-page roadmap of the warehouse without technical detail.
37

What is a window function?

CitiSQLMedium
Save to ▾
Show answer
A function that calculates over a set of rows related to the current row without collapsing them, such as ROW_NUMBER, RANK, LAG or SUM() OVER (PARTITION BY ...).
38

What is a p-value, explained simply?

Save to ▾
Show answer
A p-value is the probability of seeing a result at least as extreme as yours if the null hypothesis, usually no effect, were true. A p-value of 0.03 means that if the new page truly made no difference, results this strong would appear only about 3 percent of the time by chance. Below a chosen threshold such as 0.05 we reject the null. It is not the probability that the hypothesis is true.
39

Write SQL to calculate monthly customer churn rate.

Save to ▾
Show answer
WITH active AS ( SELECT DISTINCT customer_id, DATE_TRUNC('month', order_date) AS month FROM orders ) SELECT a.month, COUNT(*) AS active_customers, COUNT(*) - COUNT(n.customer_id) AS churned_next_month, ROUND(100.0 * (COUNT(*) - COUNT(n.customer_id)) / COUNT(*), 1) AS churn_pct FROM active a LEFT JOIN active n ON n.customer_id = a.customer_id AND n.month = a.month + INTERVAL '1 month' GROUP BY a.month ORDER BY a.month;
40

What is Power Query's role in Power BI?

Save to ▾
Show answer
It extracts and transforms data using recorded steps in M language, such as merging, unpivoting, changing types and removing errors, before loading to the model.

Tips to crack the Citi Data Analytics interview

  • Revise Java, SQL and data structures, which are commonly tested for Citi technology analyst roles.
  • Learn basics of treasury and trade services, payments and capital markets, which are core Citi businesses.
  • Prepare examples of handling pressure and attention to detail in a controlled, regulated environment.
  • Keep a one-minute story ready for every project on your CV: problem, your part, tools, result.
  • Practise the hard questions on this page aloud; Citi interviewers usually ask follow-ups on your first answer.

Frequently asked questions

How many rounds are there in the Citi Data Analytics interview?

Candidates usually go through 5 stages: Online assessment (aptitude + coding); Technical round 1; Technical round 2; Managerial round; HR round. The exact rounds change with the role, team, location and your experience, so confirm the process with the recruiter.

Which topics should I prepare for the Citi Data Analytics interview?

This practice set leans on SQL (8), Power BI (6), Statistics and Case Studies (5), Python for Analysis (5). Revise those first, then practise explaining one or two of your own projects end to end, because most Citi interviewers ask you to walk through real work.

Are these the exact questions asked at Citi?

No. These are curated practice questions that match the skills and difficulty usually tested in banking & finance interviews like Citi's. They are not a leaked or verified list of past questions.

Where does Citi hire Data Analytics professionals in India?

Citi has large teams in Pune, Chennai, Mumbai, Bengaluru, Gurugram. Openings and locations change often, so check the Citi careers page and filter by city and experience.

Data Analytics questions for similar companies