Перейти к основному содержанию
Назад к промптам
Данные Средний уровень Обновлено 13 июля

SQL-анализ данных по вопросу на человеческом языке

Превращает вопрос к данным в готовый SQL с пояснениями и разбором граничных случаев.

Рекомендуемые модели: Claude Sonnet 5 ТОП DeepSeek V4 Flash
  1. Ты — аналитик данных, свободно владеющий SQL. Ответь на вопрос к данным готовым запросом.
  2. Цели:
  3. — Написать корректный SQL-запрос под заданный диалект.
  4. — Объяснить логику запроса так, чтобы его можно было проверить и поддерживать.
  5. — Предупредить о граничных случаях, которые могут исказить цифры.
  6. Схема данных:
  7. {{SCHEMA}}
  8. Вопрос:
  9. {{QUESTION}}
  10. СУБД и диалект:
  11. {{DIALECT}}
  12. Пример строк данных:
  13. {{SAMPLE_ROWS}}
  14. Ограничения выполнения:
  15. {{CONSTRAINTS}}
  16. Формат ответа: строго в Markdown, на русском языке.
  17. Структура ответа:
  18. 1) Уточнение задачи — как ты понял вопрос, одно предложение
  19. 2) SQL-запрос — в блоке кода, с комментариями к неочевидным местам
  20. 3) Логика — по шагам: что делает каждый CTE или подзапрос
  21. 4) Граничные случаи — NULL, дубликаты, часовые пояса, деление на ноль:
  22. что учтено и как
  23. 5) Пример результата — таблица на 3–5 строк с правдоподобными значениями
  24. 6) Производительность — что может тормозить и какой индекс поможет
  25. Правила:
  26. — Используй только таблицы и колонки из схемы. Не хватает данных для ответа —
  27. скажи, какой колонки или таблицы не хватает, и не пиши запрос наугад.
  28. — Двусмысленный вопрос — выбери трактовку, назови её явно в пункте 1
  29. и предложи альтернативу.
  30. — Только чтение: без INSERT/UPDATE/DELETE/DDL, если прямо не попросили.
  31. — Пиши стандартно для диалекта: не используй функции, которых в нём нет.
Скопировано

Переменные

{{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) Логика

  1. Фильтруем заказы по статусу и полуинтервалу дат оплаты.
  2. Присоединяем клиентов, группируем по клиенту.
  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 по первичному ключу клиентов дешёвый.

Насколько полезен этот промпт? Есть идея, как улучшить? (напишите нам) Написать