Shell, Unilever & Tesco: Data Roles (Bengaluru)
Shell, Unilever & Tesco: Data Interview Experiences (Bengaluru, 2024–26). Rounds, real reported questions and model answers, compiled from public candidate reports (sources at the end). Practice mode hides every answer: say your answer first, press Show answer, then rate yourself. Use 🔁 Review again to build your revision list and 🎲 Random question for a quick drill.
About this interview
Compiled from public candidate reports: Shell Associate Data Engineer (Bengaluru campus, 2024–25: DSA, SQL, HAVING vs WHERE, OOP and DBMS), Unilever Data Analyst (Bengaluru, offer; others: case study, SQL, business questions) and Tesco Decision Scientist (Bengaluru, offers in 2023 and January 2025: Python and SQL assessments, explain XGBoost). The questions are paraphrased, and the model answers are written by EasyLearnSpace.
| Shell | Unilever | Tesco | |
|---|---|---|---|
| Role | Associate Data Engineer | Data Analyst | Decision Scientist |
| Rounds | 1.5-hour technical (2 interviewers) + HR; or 1 hour (OOP, DBMS, projects, situational) | Hiring-team interview with a case study; or 3 rounds (analysis, business, SQL) | Python + SQL assessments → technical → managerial → HR |
| Reported questions | Coding/DSA, a SQL query, HAVING vs WHERE, OOP concepts with examples | A difficult situation and how you handled it; SQL; business questions | SQL and pandas syntax; explain XGBoost |
| Outcome | 1 offer, others mixed | 2 offers, 1 not selected | 2 offers |
01Rounds at a glance
- Global capability centres (energy, FMCG, retail) hire strongly for data roles: SQL + Python + business sense.
- Tesco's Decision Scientist role is DS with a strong retail-analytics flavour.
02Questions and model answers
- Gradient-boosted decision trees: add trees sequentially, each fitting the gradient (and Hessian) of the loss with respect to the current predictions, using a second-order Taylor approximation.
- Regularised objective: loss + γ·(number of leaves) + ½λ‖leaf weights‖², giving the optimal leaf weight −G/(H + λ) and a split gain formula.
- Engineering: histogram/approximate split finding, sparsity-aware missing-value handling (a learned default direction), column and row subsampling, shrinkage (η), parallel tree building, early stopping.
- Key hyperparameters:
max_depth,eta,n_estimators,subsample,colsample_bytree,min_child_weight,lambda/alpha,scale_pos_weight.
SELECT store_id, SUM(sales) AS total
FROM transactions
WHERE txn_date >= '2025-01-01' -- filters rows before grouping
GROUP BY store_id
HAVING SUM(sales) > 1000000; -- filters groups after aggregation
- WHERE cannot use aggregates; HAVING can. Put row filters in WHERE for performance.
from abc import ABC, abstractmethod
class Sensor(ABC): # abstraction
def __init__(self, sid): self._sid = sid # encapsulation (protected attribute)
@abstractmethod
def read(self) -> float: ...
class PressureSensor(Sensor): # inheritance
def read(self): return 101.3
class TempSensor(Sensor):
def read(self): return 36.6
for s in (PressureSensor("p1"), TempSensor("t1")): # polymorphism
print(type(s).__name__, s.read())
- Decompose: distribution (number of stores stocking it) × rate of sale × price; channel (modern trade, general trade, e-commerce).
- Check: competitor launches or promotions, price increases, out-of-stocks at distributors, seasonality, ad spend changes, a pack-size change.
- Data: secondary sales (distributor → retailer), retail audit data, e-commerce share, promotion calendars.
- Recommend: fix the distribution gaps, targeted promotions, pricing adjustments; track weekly.
Answer (STAR):
- "Two stakeholders wanted conflicting definitions of 'active customer' for the same dashboard."
- "I documented both definitions, showed the numerical impact of each, and facilitated a 30-minute alignment meeting. We agreed on one primary metric plus one secondary metric."
- "The dashboard launched on time, and the definition became a company standard."
import pandas as pd
df = pd.read_csv("sales.csv", parse_dates=["date"])
weekly = (df.set_index("date").groupby("store_id")["sales"].resample("W").sum().reset_index())
weekly["wow_pct"] = weekly.groupby("store_id")["sales"].pct_change() * 100
print(weekly.head())
03How to prepare
- SQL (aggregations, HAVING, windows) and pandas fluency.
- One boosting algorithm explained deeply (XGBoost).
- FMCG and retail case frameworks (distribution × rate × price) and behavioural STAR stories.
Sources
- Glassdoor: Shell Associate Data Engineer reviews
- Glassdoor: Unilever Data Analyst reviews (2025)
- Glassdoor: Tesco Bengaluru Decision Scientist reviews