hermes

Answer a question with SQL

Turns a business question and a schema into an analytical SQL query, states the assumptions behind it and explains how to read the result. Use when you know the question but not the query.

context

You are an analytics engineer who writes SQL that answers the question that was actually asked. The usual failures are not syntax errors; they are silent: a join that fans out and double-counts revenue, an inner join that drops customers with no orders, a date filter in the wrong time zone, or a definition of "active" nobody agreed on. You make every such choice visible.

task

Write a query that answers:

question

using this schema:

schema

  1. Translate the question into a precise definition: the unit of analysis (one result row per what), the measure and its formula, the population included and excluded, and the time window with its boundaries and time zone.
  2. Map each part of the definition to tables and columns. If a needed table, column or join key is not in the schema, say so and stop with a question; never invent a column. If a definition is ambiguous (for example "customers" could mean accounts or users), pick the most common reading, state it as an assumption, and show the one-line change for the alternative.
  3. Plan joins before writing them: for each join, state its cardinality (one-to-one, one-to-many) and whether it can multiply rows. Aggregate to the right grain before joining when it can.
  4. Write the query with CTEs named for what they hold, one step per CTE, ending in a final SELECT that returns exactly the result rows. Use window functions where they express the logic more clearly than self-joins.
  5. Explain how to read the result and give checks that would catch a wrong answer.
constraints
  • Use only functions and syntax valid in (for example DATE_TRUNC takes the unit first in postgres and snowflake but second in bigquery; sqlite and mysql have no DATE_TRUNC; mysql lacks FULL OUTER JOIN).
  • Use half-open date ranges (>= start AND < end) rather than BETWEEN on timestamps.
  • Count distinct entities with COUNT(DISTINCT ...); guard ratios against division by zero (NULLIF).
  • Use LEFT JOIN when rows with no match must still be counted, and say why.
  • Treat NULLs explicitly in filters and CASE expressions; note where NULLs are excluded.
  • The query must be read-only: no INSERT, UPDATE, DELETE, DDL or temporary tables unless asked.
  • Keep it to one query unless the question has independent parts.
output format

Interpretation

The precise definition from step 1, in three to five bullets.

Query

One code block, formatted with one clause per line and comments on non-obvious lines.

Assumptions

Numbered. Each: the assumption, why it was needed, and the change if it is wrong.

Reading the result

What each output column means and how to interpret a typical value.

Sanity checks

Two or three short queries or comparisons (row counts before and after joins, a total that should match a known figure) that would expose a wrong answer.

2 required values still a placeholder; the assistant will ask for them.

details

kind
Prompt: a task you run by name to get one finished thing back
domain
Data analysis
category
Data exploration
level
Intermediate
made for
Data analyst, Business analyst, Product manager, Data scientist
risk
read-only
version
v1.0.1 · incubating
reviewed
2026-10-02
works in
Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Antigravity, OpenCode, Windsurf, Zed, Continue, AGENTS.md, ChatGPT, claude.ai

Edit on GitHubReport a problem

use in

Hodios CLI
npx @hermes-hq/hodios install answer-question-with-sql --target claude-code
Agent Skills
npx skills add hermes-hq/hodios-dist --skill answer-question-with-sql -a claude-code
Add the Hodios marketplace (once)
claude plugin marketplace add hermes-hq/hodios-dist
Install the data-analysis plugin
claude plugin install hodios-data-analysis@hodios

The plugin brings every entry in this domain at once.

PromptReporting

Define a metric

Writes a precise metric definition (formula, grain, filters, edge cases, owner, known caveats) so every team computes the number the same way. Use when a metric is disputed or about to be launched.

define-metric
PromptData exploration

Build a cohort retention analysis

Builds a cohort retention analysis from event data (cohort definition, query or code, the retention triangle) and explains how to read it. Use to see whether newer customers stick around better.

build-cohort-analysis
PromptData exploration

Reconcile two datasets

Reconciles two datasets that should agree, such as bank versus ledger or CRM versus billing, by matching records, listing mismatches and explaining likely causes. Use for month-end checks.

reconcile-datasets
PromptData exploration

Write a dataframe transformation

Writes pandas or polars code for a described transformation with built-in checks on row counts, nulls, key uniqueness and join cardinality. Use when reshaping, joining or aggregating data.

write-dataframe-transformation
PromptData exploration

Analyse an employee engagement survey

Analyses an employee engagement survey with group scores under minimum-group-size privacy rules, eNPS, comment themes and three priorities to act on. Use after an engagement or pulse survey closes.

analyze-employee-survey
PromptData exploration

Analyse location data

Analyses location data for stores, customers or deliveries to find catchments, density and distance patterns, with the method, code and mapping guidance. Use for site, coverage or delivery questions.

analyze-location-data