Взлом аналитики: 12 промтов, которые превратят LLM в твоего SQL-архитектора

Каждый аналитик знает это чувство: глаза наливаются кровью, когда нужно вытащить из БД данные для отчёта, а в голове — каша из JOIN'ов и подзапросов. Что если я скажу, что нейросеть может взять на себя рутину и даже предложить оптимизации, о которых ты не задумывался? Речь не о магии, а о правильно составленных промтах. Я собрал 12 проверенных сценариев — от генерации кода до отладки и тонкой настройки под конкретную СУБД. Поехали.

1. Генерация запроса по описанию задачи

Задача: Быстро получить рабочий SQL по текстовому описанию.

Промт: «Ты — старший SQL-разработчик. Составь запрос для PostgreSQL, который выводит топ-10 клиентов по сумме заказов за последний месяц. Учитывай, что таблица clients содержит id, name, created_at; таблица orders — id, client_id, total, created_at. Используй CTE и оконные функции, если это уместно. Прокомментируй каждую часть запроса.»

Пример результата:

WITH monthly_orders AS (
  SELECT client_id, SUM(total) AS total_sum
  FROM orders
  WHERE created_at >= date_trunc('month', CURRENT_DATE) - INTERVAL '1 month'
    AND created_at < date_trunc('month', CURRENT_DATE)
  GROUP BY client_id
)
SELECT c.name, mo.total_sum
FROM clients c
JOIN monthly_orders mo ON c.id = mo.client_id
ORDER BY mo.total_sum DESC
LIMIT 10;

LLM объяснит, почему использует date_trunc для попадания в прошлый месяц, и добавит комментарии.

2. Перевод с MySQL на ClickHouse

Задача: Перенести запрос между СУБД без потери производительности.

Промт: «Перепиши этот MySQL-запрос для ClickHouse, используя специфические функции (например, arrayJoin, если нужно развернуть массивы) и учитывая отсутствие оконных функций в старых версиях. Исходный запрос: ...»

Пример: MySQL: SELECT user_id, COUNT(*) FROM actions WHERE date > '2026-01-01' GROUP BY user_id; → ClickHouse: SELECT user_id, count() FROM actions WHERE date > '2026-01-01' GROUP BY user_id; LLM также предложит использовать count() вместо COUNT(*), что идиоматично для ClickHouse, и объяснит разницу в синтаксисе.

3. Создание запроса для аналитики поведения пользователей

Задача: Получить данные о воронке продаж с помощью SQL.

Промт: «Напиши SQL-запрос для BigQuery, который считает конверсию по шагам воронки: просмотр страницы → добавление в корзину → покупка. Данные в таблице events (event_name, user_id, timestamp). Выведи количество пользователей на каждом шаге и конверсию между шагами. Учти, что пользователь может совершить действия в разное время.»

Пример:

WITH funnel AS (
  SELECT
    user_id,
    MAX(CASE WHEN event_name = 'view' THEN timestamp END) AS view_time,
    MAX(CASE WHEN event_name = 'cart' THEN timestamp END) AS cart_time,
    MAX(CASE WHEN event_name = 'purchase' THEN timestamp END) AS purchase_time
  FROM events
  GROUP BY user_id
)
SELECT
  COUNTIF(view_time IS NOT NULL) AS viewers,
  COUNTIF(cart_time > view_time) AS added_to_cart,
  COUNTIF(purchase_time > cart_time) AS purchased,
  SAFE_DIVIDE(COUNTIF(cart_time > view_time), COUNTIF(view_time IS NOT NULL)) AS view_to_cart,
  SAFE_DIVIDE(COUNTIF(purchase_time > cart_time), COUNTIF(cart_time > view_time)) AS cart_to_purchase
FROM funnel;

4. Автоматическое создание JOIN-запросов по схеме данных

Задача: Сгенерировать сложный JOIN, когда известно несколько таблиц.

Промт: «У меня есть таблицы: users (id, name, email), orders (id, user_id, amount, created_at), order_items (order_id, product_id, quantity), products (id, name, price). Напиши запрос, который выводит для каждого пользователя сумму его заказов и список купленных товаров (через STRING_AGG). Оптимизируй: используй индексы, избегай SELECT *, ограничь выборку. СУБД — PostgreSQL 15.»

Пример: LLM создаст запрос с LEFT JOIN, агрегацией и пояснит, почему STRING_AGG требует GROUP BY.

5. Оптимизация медленного запроса

Задача: Улучшить производительность существующего запроса.

Промт: «Вот запрос, который выполняется 30 секунд на PostgreSQL. Таблица orders содержит 10 млн строк, order_items — 50 млн. Посоветуй, как ускорить: добавление индексов, переписывание с EXISTS, использование MATERIALIZED VIEW? Объясни, как проверить план выполнения через EXPLAIN ANALYZE.»

Пример: LLM предложит создать индекс на orders(user_id, created_at), заменить IN на EXISTS, и покажет, как читать вывод EXPLAIN.

6. Написание запроса с подзапросами в FROM

Задача: Использовать производные таблицы для сложной агрегации.

Промт: «SQL-запрос для ClickHouse: найти среднюю сумму заказа по каждому клиенту, но только для клиентов, у которых больше 5 заказов. Используй подзапрос в FROM и HAVING. Покажи два варианта: с подзапросом и с CTE, объясни разницу в производительности.»

Пример: LLM выдаст оба варианта и пояснит, что ClickHouse оптимизирует подзапросы иначе, чем PostgreSQL.

7. Генерация запросов для работы с датами и временем

Задача: Фильтрация и группировка по времени.

Промт: «Сгенерируй SQL для MySQL, который группирует заказы по неделям и выводит количество и сумму заказов за каждую неделю 2026 года. Используй YEARWEEK() и объясни, как обработать границы года.»

Пример:

SELECT YEARWEEK(created_at, 1) AS week_number,
       COUNT(*) AS orders_count,
       SUM(total) AS total_sum
FROM orders
WHERE YEAR(created_at) = 2026
GROUP BY week_number
ORDER BY week_number;

LLM добавит пояснение про режим 1 (неделя начинается с понедельника).

8. Обработка NULL-значений и COALESCE

Задача: Избежать ошибок при работе с пустыми данными.

Промт: «Напиши запрос для PostgreSQL, который выводит имя клиента и его последний заказ, но если заказа нет — покажи "Нет заказов". Используй LEFT JOIN и COALESCE. Также добавь сортировку по дате последнего заказа (NULL последними).»

Пример: LLM предложит ORDER BY orders.created_at NULLS LAST.

9. Использование оконных функций для ранжирования

Задача: Вычислить топ-N по группам.

Промт: «Для ClickHouse напиши запрос, который для каждого товара выводит топ-3 клиента по сумме покупок этого товара. Используй ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY sum DESC). Учти, что ClickHouse поддерживает оконные функции с версии 21.1. Покажи, как ограничить вывод тремя строками на группу (QUALIFY не поддерживается, используй подзапрос).»

Пример: LLM даст решение с подзапросом и фильтрацией по rn <= 3.

10. Генерация тестовых данных для проверки запроса

Задача: Создать фейковые данные для отладки.

Промт: «Сгенерируй SQL-скрипт для MySQL, который создаст временную таблицу с 1000 случайных пользователей (id, имя, email) и 5000 заказов (случайные даты за последний год). Используй функции RAND() и DATE_ADD().»

Пример: LLM создаст INSERT с генерацией случайных строк.

11. Подсказки по EXPLAIN и диагностике

Задача: Понять, почему запрос медленный.

Промт: «Объясни, как интерпретировать вывод EXPLAIN ANALYZE для PostgreSQL. Вот вывод: ... Что означает "Seq Scan on orders"? Почему используется Hash Join? Дай рекомендации по улучшению.»

Пример: LLM разберёт план и укажет на проблему — отсутствие индекса.

12. Трансформация SQL в Python-код

Задача: Перенести логику запроса в pandas.

Промт: «Перепиши этот SQL-запрос в эквивалентный код pandas: SELECT department, AVG(salary) FROM employees GROUP BY department HAVING AVG(salary) > 50000; Покажи, как использовать groupby и фильтрацию.»

Пример:

import pandas as pd
result = df.groupby('department')['salary'].mean().reset_index()
result = result[result['salary'] > 50000]

13. Написание запроса с UNION и UNION ALL

Задача: Объединить данные из нескольких источников.

Промт: «Составь запрос для ClickHouse, который объединяет данные о продажах из двух таблиц (sales_2025, sales_2026) и выводит общую сумму по годам. Используй UNION ALL и объясни, почему UNION ALL быстрее, чем UNION.»

Пример: LLM покажет разницу в производительности.

14. Создание запроса для поиска дубликатов

Задача: Найти повторяющиеся записи.

Промт: «Напиши SQL для MySQL, который находит дубликаты в таблице users по email. Выведи email и количество повторений. Используй GROUP BY и HAVING COUNT(*) > 1.»

Пример:

SELECT email, COUNT(*) FROM users GROUP BY email HAVING COUNT(*) > 1;

15. Преобразование строк в столбцы (PIVOT)

Задача: Сделать кросс-таблицу.

Промт: «В PostgreSQL нет PIVOT, но можно использовать FILTER. Напиши запрос, который из таблицы sales (salesperson, quarter, amount) выводит продажи по кварталам в виде столбцов Q1, Q2, Q3, Q4.»

Пример: LLM покажет использование SUM(amount) FILTER (WHERE quarter = 'Q1').

16. Подсказка по использованию HAVING и WHERE

Задача: Правильно фильтровать агрегаты.

Промт: «Объясни разницу между WHERE и HAVING на примере: найти отделы со средней зарплатой > 50000, но учитывать только сотрудников старше 30 лет. Напиши запрос для PostgreSQL.»

Пример: LLM покажет, что WHERE применяется до GROUP BY, а HAVING — после.

17. Генерация запроса с рекурсивным CTE

Задача: Вывести иерархию (дерево).

Промт: «Составь рекурсивный SQL для PostgreSQL, который выводит всех подчинённых сотрудника с id=1 в таблице employees (id, manager_id, name). Используй WITH RECURSIVE.»

Пример: LLM даст запрос с UNION ALL и объяснит, как работает рекурсия.

18. Оптимизация под ClickHouse: материализованные представления

Задача: Ускорить агрегацию на больших данных.

Промт: «Объясни, как создать материализованное представление в ClickHouse для суммы продаж по дням. Приведи пример CREATE MATERIALIZED VIEW с агрегатной функцией sumState и sumMerge.»

Пример: LLM покажет, как использовать агрегатные функции-комбинаторы.

Эти промты — не просто шаблоны, а фундамент для построения диалога с нейросетью. Пробуй, адаптируй под свои задачи, и ты заметишь, как рутинная работа с SQL ускорится в разы. А если хочешь прокачаться ещё глубже — загляни в наш блог, там много полезного об AI-инструментах.

← Все статьи

Комментарии

Читайте также