Skip to content
Ian Cunningham monogramIan CunninghamData & AI consultant

Blog

Practical thinking across data, analytics, and AI

I use this space to work through real technical and delivery questions, from understanding data and generating business insight to building AI workflows that people can operate and trust.

Articles

Explore the writing

Choosing an Analytical Architecture Without Starting with the Product

Choosing an Analytical Architecture Without Starting with the Product

A requirements-led comparison of data warehouses, data lakes, lakehouses, and combined analytical architectures, including how these ideas appear in Microsoft Fabric.

Designing a Warehouse That Can Be Operated, Not Just Built

Designing a Warehouse That Can Be Operated, Not Just Built

How service objectives, monitoring, capacity planning, recovery, security, and controlled change turn a deployed data warehouse into a dependable analytical service.

ETL, ELT, and the Work Required to Make Data Trustworthy

ETL, ELT, and the Work Required to Make Data Trustworthy

How ETL and ELT differ, what dependable data transformation involves, and how validation, restartability, and reconciliation turn a completed load into credible evidence.

Keeping Historical Context in a Data Warehouse

Keeping Historical Context in a Data Warehouse

How to decide whether warehouse data should show the current view, retain earlier business context, or restate history when records arrive late or require correction.

Designing a Dimensional Model That Reflects the Business

Designing a Dimensional Model That Reflects the Business

A practical guide to selecting a business process, declaring the grain, identifying dimensions and facts, and designing analytical models that support valid decisions.

From Source Systems to Business Insight: The Layers of a Data Warehouse

From Source Systems to Business Insight: The Layers of a Data Warehouse

A practical guide to the ingestion, staging, transformation, warehouse, semantic, and consumption responsibilities that turn source data into trustworthy analytical information.

Start with Decisions, Not Tables: Planning a Data Warehouse

Start with Decisions, Not Tables: Planning a Data Warehouse

A practical guide to defining the decisions, business processes, ownership, scope, and delivery approach that should shape a data warehouse before technology choices begin.

What a Data Warehouse Is Really For

What a Data Warehouse Is Really For

A practical explanation of the problems data warehouses solve, how they differ from operational systems, and when building one may not be justified.

Completing a SQL Sales Analytics Project

Completing a SQL Sales Analytics Project

A practical review of an end-to-end SQL sales analytics project, its business findings, technical outcomes, remaining limitations, and next steps into Microsoft Fabric and Power BI.

Designing an Analytics-Friendly Data Model

Designing an Analytics-Friendly Data Model

A practical dimensional-modelling case study that transforms AdventureWorks OLTP sales data into a validated star schema for analytical reporting.

Optimising SQL for Analytical Workloads

Optimising SQL for Analytical Workloads

A measured SQL performance-tuning case study using execution plans, logical reads, searchable date predicates, covering indexes, and grain-aware query design.

Using Advanced SQL to Generate Business Insights

Using Advanced SQL to Generate Business Insights

A practical use of SQL ranking, Pareto analysis, value quartiles, and acquisition cohorts to investigate commercial concentration and repeat purchasing.

Time-Series Analysis with SQL

Time-Series Analysis with SQL

A practical SQL analysis of monthly sales using complete date series, running totals, moving averages, year-over-year comparisons, customer mix, and cautious seasonality checks.

Analysing Regional Sales Performance with SQL

Analysing Regional Sales Performance with SQL

A practical SQL analysis of sales territories, shipping geographies, customer and channel mix, product mix, geographic concentration, and recent regional direction.

Measuring Product Performance with SQL

Measuring Product Performance with SQL

A practical SQL analysis of product and category performance using sales value, quantity, customer reach, discounting, product families, and recent direction.

Analysing Customer Purchasing Behaviour with SQL

Analysing Customer Purchasing Behaviour with SQL

A practical SQL analysis of customer activity, repeat purchases, order frequency, average order value, recency, and purchase cadence using AdventureWorks2025.

Preparing Sales Data for Analysis with SQL

Preparing Sales Data for Analysis with SQL

A practical approach to building reusable SQL views over AdventureWorks2025, with consistent customer, order, product, geography, date, and financial definitions.

Assessing Sales Data Quality with SQL

Assessing Sales Data Quality with SQL

A practical assessment of AdventureWorks2025 sales data quality, covering missing values, duplicates, validity, reconciliation, referential integrity, and analytical limitations.

Understanding the Sales Data Landscape with SQL

Understanding the Sales Data Landscape with SQL

A practical exploration of the AdventureWorks2025 sales schema, from customers and orders to products, territories, and the different grains that shape reliable analysis.

Building a Sales Analytics Solution with SQL: Project Overview

Building a Sales Analytics Solution with SQL: Project Overview

An introduction to a practical SQL portfolio project that turns operational sales data into useful analysis, business findings, and an analytics-ready foundation.

Exploring Microsoft's AI Agent Adoption Framework

Exploring Microsoft's AI Agent Adoption Framework

A practical look at Microsoft's AI agent adoption framework, and why successful agent adoption starts with business value, governance, data readiness, and operational maturity.

Temporal and Pydantic AI: A Durable Human-in-the-Loop Research Demo

Temporal and Pydantic AI: A Durable Human-in-the-Loop Research Demo

A practical walkthrough for running AI agent work inside durable Temporal workflows with Pydantic AI, FastAPI, and Next.js.

Learning the Pydantic AI Agent: A Practical Roadmap

Learning the Pydantic AI Agent: A Practical Roadmap

A simple roadmap for learning the core concepts behind Pydantic AI's Agent class without getting lost in the implementation details.

The 5% of Enterprise AI Projects That Succeed Aren't Winning by Accident

The 5% of Enterprise AI Projects That Succeed Aren't Winning by Accident

MIT found that just 5% of enterprise AI pilots are generating meaningful returns. For many project professionals, the reasons why may sound surprisingly familiar.

Pydantic Graph and CopilotKit: A Minimal Full-Stack Workflow Demo

Pydantic Graph and CopilotKit: A Minimal Full-Stack Workflow Demo

A practical walkthrough for connecting a Pydantic Graph workflow to a CopilotKit frontend with FastAPI and AG-UI.

Pydantic AI and CopilotKit: A Minimal Full-Stack Agent Demo

Pydantic AI and CopilotKit: A Minimal Full-Stack Agent Demo

A practical walkthrough for connecting a Pydantic AI agent to a CopilotKit frontend with FastAPI and AG-UI.

PostgreSQL: The Swiss Army Knife for Agentic Databases

PostgreSQL: The Swiss Army Knife for Agentic Databases

Modern AI systems increasingly tempt developers toward specialized databases for every problem. In practice, PostgreSQL can often handle far more than people realize.

In the AI Regulatory Landscape, Agentic Graphs Can Make a Lot of Sense

In the AI Regulatory Landscape, Agentic Graphs Can Make a Lot of Sense

When legal requirements, human approvals, sensitive data, operational guarantees, and governance concerns enter the picture, deterministic workflows start looking a lot more like responsible system design.

What It Takes to Build Production-Ready LangGraph Systems

What It Takes to Build Production-Ready LangGraph Systems

A production-oriented checklist for LangGraph systems: deterministic tests, evaluations, parallel workflows, control flow, and observability.

Command vs Send in LangGraph: Choosing the Right Primitive

Command vs Send in LangGraph: Choosing the Right Primitive

When to use Command for control flow and Send for data parallelism in LangGraph, with practical testing examples for each.

Understanding LangGraph Workflows with LangSmith Traces and pytest

Understanding LangGraph Workflows with LangSmith Traces and pytest

How LangSmith tracing complements pytest by showing the execution path behind LangGraph routing, retries, aggregation, and failures.

Testing Parallel LangGraph Workflows Without Losing Control

Testing Parallel LangGraph Workflows Without Losing Control

How to test LangGraph fan-out, Send-based parallel work, aggregation, and branch failure behavior without relying on output guessing.

Testing Isn’t Enough: Evaluating LangGraph Workflows That Actually Work

Testing Isn’t Enough: Evaluating LangGraph Workflows That Actually Work

A practical evaluation pattern for LangGraph using pytest, small datasets, deterministic scorers, and LangSmith-backed experiment tracking.

How to Structure LangGraph Tests That Actually Scale

How to Structure LangGraph Tests That Actually Scale

How to structure LangGraph tests into unit, graph, and failure layers so the suite stays useful as the workflow grows.

Stop Testing AI Outputs. Start Testing State

Stop Testing AI Outputs. Start Testing State

A better way to test LangGraph workflows by treating the graph as state transitions instead of judging final answer text.

Progress Indication with LangGraph and CopilotKit

Progress Indication with LangGraph and CopilotKit

A practical pattern for rendering progress cards in CopilotKit chat while LangGraph runs long-running agent workflows.

When LangGraph Fails, Your UX Shouldn’t: Designing Graceful Error Handling

When LangGraph Fails, Your UX Shouldn’t: Designing Graceful Error Handling

A practical pattern for routing LangGraph failures to a user-facing error handler without breaking the user experience.

Want to see how these ideas translate into working solutions?