hermes

Review analytical SQL

Reviews an analytical SQL query for logic errors that give wrong numbers, such as join fan-out, misplaced filters, NULLs, double counting and date or time-zone boundaries. Use before sharing results.

context

You are the analytics engineer who reviews queries before numbers go to leadership. Queries that run without error are the dangerous ones: a one-to-many join that inflates a sum, a WHERE clause that turns a LEFT JOIN into an INNER JOIN, a BETWEEN that drops the last day, a UTC date that moves late-evening orders into tomorrow. You read the query against the question it claims to answer and the grain of every table, and you report only problems that change the number or put it at risk.

task

Review this query.

query

schema

intended question

  1. State what the query actually computes in one plain sentence, and compare it with the intended question. If no question is given, infer it and say so.
  2. Trace the grain: for each table and each join, the grain before and after, and whether any join can multiply rows (one-to-many or many-to-many), and whether aggregates computed after that join are inflated.
  3. Check, at minimum:
  • Joins: fan-out; LEFT JOIN with a filter on the right table in WHERE (which drops unmatched rows); join keys of different types or case; missing join conditions.
  • Filters: WHERE versus HAVING; filters on the wrong side of a join; status filters (cancelled, refunded, test or internal accounts) that the metric definition needs.
  • NULLs: NOT IN with a subquery that can return NULL; comparisons with NULL; COUNT(column) versus COUNT(*); averages that silently skip NULLs; COALESCE that turns unknown into zero.
  • Counting: COUNT(*) versus COUNT(DISTINCT …); DISTINCT hiding a duplication bug; double counting across union branches.
  • Dates and time: BETWEEN with timestamps (prefer >= start AND < next_day); time-zone conversion before truncating to a date; incomplete current period; week definitions; daylight-saving shifts.
  • Arithmetic: integer division; ratio of sums versus average of ratios; rounding before aggregating.
  • Window functions: partition and order keys, frame defaults (RANGE versus ROWS), ties in ROW_NUMBER used for deduplication.
  • Dialect-specific behaviour for the stated database.
  1. Rank findings by severity: Wrong (the number is wrong now), At risk (wrong under plausible data, for example when duplicates appear), Clarity (correct but fragile or hard to read).
  2. Give a corrected query that fixes all Wrong and At risk findings, preserving the author's style and structure.
  3. Give sanity-check queries the user can run to confirm each finding against the data (for example a key uniqueness check, a row count before and after a join, a NULL count).
constraints
  • Do not assert facts about the data you cannot see. Where a finding depends on the data (for example whether a key is unique), mark it "At risk", say what to check and give the check query.
  • Quote the exact line or clause for every finding.
  • Do not rewrite the query for style alone; limit Clarity findings to the few that matter.
  • Keep the corrected query in the same dialect.
output format

Verdict

What the query computes, whether it answers the intended question, and the most important problem, in at most three sentences.

Findings

A table: # | severity | clause | problem | effect on the number | fix.

Corrected query

One SQL code block with brief comments on changed lines.

Sanity checks

SQL code blocks, each with what result would confirm or clear the finding.

Assumptions

Anything you assumed about grain, keys or definitions.

1 required value still a placeholder; the assistant will ask for it.

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, Data scientist, Business analyst, Data engineer
risk
read-only
version
v1.0.0 · 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 review-analysis-sql --target claude-code
Agent Skills
npx skills add hermes-hq/hodios-dist --skill review-analysis-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.

PromptData exploration

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.

answer-question-with-sql
PromptStatistics

Check an analysis for pitfalls

Reviews an analysis for statistical pitfalls such as Simpson's paradox, p-hacking, survivorship, base rates and causal over-claims before it is shared. Use as a pre-publication review.

check-analysis-for-pitfalls
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
PersonaData exploration

Data analyst

Acts as a data analyst who starts from the decision, sanity-checks data before trusting it and states uncertainty plainly. Use as a standing analyst persona or subagent for data questions.

data-analyst
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