Case study · Nordvik Sparebank EN NO

Nordvik Sparebank

Hi, and thanks for making time for this.

You're a data engineer at Nordvik Sparebank, a Norwegian regional savings bank. Today their analytics run directly against a Postgres read-replica. They've asked you to build a small warehouse layer that gets one specific business job done end-to-end.

Most candidates spend two to three hours on this. Spend more if you want, spend less if you want. There's nothing to hand in: when you're done, you'll walk us through what you built. We're more interested in how you think and the calls you made than in any particular output.

We use havn, a self-hosted data platform built on DuckDB. Plain SQL transforms, Python ingest, single-file warehouse. If you've used dbt or Databricks you'll be productive in minutes.

Pick one of three routes

Pick the question that sounds most interesting to you. You don't need to do more than one.

A Suspicious activity

Nordvik's compliance team wants a defensible shortlist of transactions worth investigating. They're tired of looking at "anything over NOK 50,000" and getting either nothing or thousands of rows. Build them something better, and explain what "suspicious" means in your model.

B Monthly management reporting

The CFO wants a one-page monthly summary she can read on her phone: total revenue, fee income, active customers, active accounts, top branches, trend versus prior month. Same numbers every month, reconciling cleanly to last month's report, with footnotes for anything that's been restated since.

C Customer 360

The retail team wants a per-customer monthly view: inflow, outflow, net flow, top spend categories, churn signals. They'll use it to segment and to prioritise outreach. PII handling is on you; compliance will ask.

What to build

Whatever you'd be comfortable presenting. As a starting point:

havn projects ship with bronze/, silver/, gold/ folders under transform/. Use them as you see fit. We have no prescription for which models to build, what schemas look like, or what they're called. That's part of what we want to see.

Get started

Three setups. Pick the one that matches what you want the two to three hours to be about. All three see the same data and we evaluate them the same way.

Analytics Engineer route

The ingest script is already written for you. The five raw tables land in landing.* when you run it, and you spend your time on modelling.

pip install havn
havn init nordvik --from https://altrocase.demant.app/bootstrap-with-ingest.tar.gz
cd nordvik
havn serve

Data Engineer route

Empty scaffold. You write the Postgres-to-DuckDB ingest yourself, then the modelling on top.

pip install havn
havn init nordvik --from https://altrocase.demant.app/bootstrap-no-ingest.tar.gz
cd nordvik
havn serve

Bring your own tool

Skip havn entirely. Download the five raw tables as Parquet and use whatever you like: pandas, polars, R, DuckDB CLI, BigQuery, your own warehouse. Same data, same evaluation. Tell us what you used when we walk through the work together.

curl -O https://altrocase.demant.app/nordvik-data.tar.gz
tar -xzf nordvik-data.tar.gz
cd nordvik-data
# customers.parquet, accounts.parquet, transactions.parquet,
# fx_rates.parquet, branches.parquet

Source-table documentation

raw.customers

Customer master. ~10,000 rows

raw.accounts

Accounts per customer. ~19,000 rows

raw.transactions

Three years of activity. ~2,600,000 rows

raw.fx_rates

Daily FX rates to NOK. ~3,800 rows

raw.branches

Branch master. ~120 rows

Conventions