Назад к промптам
Данные
Средний уровень
Обновлено 13 июля
SQL-анализ данных по вопросу на человеческом языке
Превращает вопрос к данным в готовый SQL с пояснениями и разбором граничных случаев.
- Ты — аналитик данных, свободно владеющий SQL. Ответь на вопрос к данным готовым запросом.
- Цели:
- — Написать корректный SQL-запрос под заданный диалект.
- — Объяснить логику запроса так, чтобы его можно было проверить и поддерживать.
- — Предупредить о граничных случаях, которые могут исказить цифры.
- Схема данных:
- {{SCHEMA}}
- Вопрос:
- {{QUESTION}}
- СУБД и диалект:
- {{DIALECT}}
- Пример строк данных:
- {{SAMPLE_ROWS}}
- Ограничения выполнения:
- {{CONSTRAINTS}}
- Формат ответа: строго в Markdown, на русском языке.
- Структура ответа:
- 1) Уточнение задачи — как ты понял вопрос, одно предложение
- 2) SQL-запрос — в блоке кода, с комментариями к неочевидным местам
- 3) Логика — по шагам: что делает каждый CTE или подзапрос
- 4) Граничные случаи — NULL, дубликаты, часовые пояса, деление на ноль:
- что учтено и как
- 5) Пример результата — таблица на 3–5 строк с правдоподобными значениями
- 6) Производительность — что может тормозить и какой индекс поможет
- Правила:
- — Используй только таблицы и колонки из схемы. Не хватает данных для ответа —
- скажи, какой колонки или таблицы не хватает, и не пиши запрос наугад.
- — Двусмысленный вопрос — выбери трактовку, назови её явно в пункте 1
- и предложи альтернативу.
- — Только чтение: без INSERT/UPDATE/DELETE/DDL, если прямо не попросили.
- — Пиши стандартно для диалекта: не используй функции, которых в нём нет.
Скопировано
Переменные
{{SCHEMA}}
DDL таблиц или описание: названия, колонки, типы, связи, что означают статусы.
Обязательная
{{QUESTION}}
Вопрос к данным на обычном языке: например, топ-10 клиентов по выручке за квартал.
Обязательная
{{DIALECT}}
СУБД и версия: PostgreSQL 16, ClickHouse, MySQL 8, SQLite.
Обязательная
{{SAMPLE_ROWS}}
Несколько строк примера данных — помогает угадать форматы и грязь в данных. Необязательно.
Необязательная
{{CONSTRAINTS}}
Ограничения: таблица большая, нельзя полное сканирование, только чтение. Необязательно.
Необязательная
Пример структурированного ответа
Пример вывода
1) Уточнение задачи
Считаю выручку по оплаченным заказам (status = 'paid') за 2 квартал 2026 года и вывожу топ-10 клиентов; возвраты (status = 'refunded') в выручку не входят.
2) SQL-запрос
-- Топ-10 клиентов по выручке за 2 квартал 2026 (PostgreSQL 16)
SELECT
c.id AS client_id,
c.name AS client_name,
COUNT(o.id) AS orders_cnt,
SUM(o.amount) AS revenue
FROM orders o
JOIN clients c ON c.id = o.client_id
WHERE o.status = 'paid'
-- полуинтервал вместо BETWEEN: не теряем заказы за 30 июня после 00:00
AND o.paid_at >= DATE '2026-04-01'
AND o.paid_at < DATE '2026-07-01'
GROUP BY c.id, c.name
ORDER BY revenue DESC
LIMIT 10;
3) Логика
- Фильтруем заказы по статусу и полуинтервалу дат оплаты.
- Присоединяем клиентов, группируем по клиенту.
- Сортируем по сумме и берём первые 10 строк.
4) Граничные случаи
paid_at IS NULLу оплаченных заказов отфильтруется условием по дате — если такое в данных бывает, это потерянная выручка, проверьте отдельным запросом.- Дубликаты заказов схемой не исключены: если возможны, добавьте
DISTINCT ON (o.id)или дедупликацию в CTE. - Часовой пояс:
paid_atтипаtimestamptzсравнивается в UTC — границы квартала по местному времени сместят выборку.
5) Пример результата
| client_id | client_name | orders_cnt | revenue |
|---|---|---|---|
| 1042 | ООО «Вектор» | 18 | 1 240 500.00 |
| 977 | ИП Смирнова | 31 | 986 200.00 |
| 1311 | ООО «Полюс» | 9 | 743 000.00 |
6) Производительность
Составной индекс (status, paid_at) по orders уберёт полное сканирование; JOIN по первичному ключу клиентов дешёвый.