Разработчики старой школы, новой школы, вайбкодеры — все обожают regex. Это же идеальный инструмент для работы с текстом и переменными. В Postgres отличная поддержка регулярных выражений. Вот примеры запросов на поиск и замену текста.
👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
Оконные функции в Postgres — это супер
С помощью SQL можно быстро:
🔸 Считать накопительные суммы
🔸 Строить агрегаты по группам / партициям
🔸 Создавать рейтинги и ранжирование
🔸 Делать lag/lead-анализ — сравнивать значения из разных строк
🔸 Вычислять скользящие (moving/rolling) средние
Вот практический туториал
👉 @SQLPortal
С помощью SQL можно быстро:
Вот практический туториал
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
pg_eventserv: передача событий Postgres
https://github.com/crunchydata/pg_eventserv
👉 @SQLPortal
LISTEN/NOTIFY
в WebSocket-соединения.https://github.com/crunchydata/pg_eventserv
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
This media is not supported in your browser
VIEW IN TELEGRAM
Отслеживай отношения родитель–потомок в Oracle SQL с помощью
Полезные вспомогательные функции:
🔸
🔸
🔸
👉 @SQLPortal
CONNECT BY
:SELECT ...
FROM ...
START WITH <корневая_запись>
CONNECT BY PRIOR parent_row = child_row
Полезные вспомогательные функции:
LEVEL
— глубина текущей строки в иерархииCONNECT_BY_ISLEAF
— возвращает 1, если у строки нет потомковSYS_CONNECT_BY_PATH
— путь от корня до текущей строкиPlease open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3
Почему Postgres становится таким популярным для AI-нагрузок?
Но вот почему Postgres активно набирает популярность в AI-сфере:
➤ Интеграция AI с существующей или новой data-инфраструктурой
AI-приложения, как правило, работают с уже существующими структурированными данными — пользователи, клиенты, продукты, транзакции и т.д.
Postgres позволяет объединять эмбеддинги и выходные данные моделей с реляционными таблицами, чтобы строить AI-инструменты поверх существующих систем.
➤ Поддержка векторных типов данных
Расширение pgvector добавляет хранение эмбеддингов прямо в Postgres. Это зрелое, проверенное решение, поддерживаемое большинством поставщиков и пользователей Postgres.
pgvector также предоставляет продвинутые стратегии индексации (например, HNSW), которые ускоряют поиск и работу с векторами.
➤ Готовность к продакшену
Postgres покрывает все требования бизнеса: бэкапы, connection pooling, высокая доступность.
Это значит, что на нём можно запускать cutting-edge AI-проекты на стабильной, зрелой платформе, готовой к реальной эксплуатации.
👉 @SQLPortal
Нам не раз задавали этот вопрос — и мы понимаем почему: 30-летняя реляционная СУБД на первый взгляд не выглядит как инструмент, созданный для мира ИИ.
Но вот почему Postgres активно набирает популярность в AI-сфере:
➤ Интеграция AI с существующей или новой data-инфраструктурой
AI-приложения, как правило, работают с уже существующими структурированными данными — пользователи, клиенты, продукты, транзакции и т.д.
Postgres позволяет объединять эмбеддинги и выходные данные моделей с реляционными таблицами, чтобы строить AI-инструменты поверх существующих систем.
➤ Поддержка векторных типов данных
Расширение pgvector добавляет хранение эмбеддингов прямо в Postgres. Это зрелое, проверенное решение, поддерживаемое большинством поставщиков и пользователей Postgres.
pgvector также предоставляет продвинутые стратегии индексации (например, HNSW), которые ускоряют поиск и работу с векторами.
➤ Готовность к продакшену
Postgres покрывает все требования бизнеса: бэкапы, connection pooling, высокая доступность.
Это значит, что на нём можно запускать cutting-edge AI-проекты на стабильной, зрелой платформе, готовой к реальной эксплуатации.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Материализованные представления (Materialized Views, MVs) хранят результаты запроса.
Основная проблема — поддержание их в актуальном состоянии.
Killianlynchh показывает, как материализованные представления в реальном времени (с параметром
👉 @SQLPortal
Основная проблема — поддержание их в актуальном состоянии.
Killianlynchh показывает, как материализованные представления в реальном времени (с параметром
ON QUERY COMPUTATION
в Oracle Database) позволяют получать актуальные данные, применяя изменения к устаревшим представлениям.Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2
Вы можете использовать
...за исключением случая:
Почему так?
поэтому доступны только те столбцы, что явно указаны в
Объяснение от Lukas Eder — blog.jooq.org
👉 @SQLPortal
ORDER BY
по столбцам, которых нет в SELECT-списке запроса....за исключением случая:
SELECT DISTINCT this FROM t ORDER BY that -- некорректно!
Почему так?
DISTINCT
удаляет дубликаты из выбранных значений и формирует новую таблицу,поэтому доступны только те столбцы, что явно указаны в
SELECT
Объяснение от Lukas Eder — blog.jooq.org
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3
SQL TO-DO LIST для аналитика данных
Создание таблицы
Вставка данных в таблицу
Базовый SELECT
WHERE
ORDER BY
LIMIT
🔸 Advanced SQL Tasks (общие)
Запуск дашборда в Power BI / Tableau на SQL-данных
Выполнение SQL-запросов на датасетах:
> Chinook Database: https://github.com/lerocha/chinook-database
> IMDB data: https://imdb.com/interfaces/
🔸 Intermediate SQL Tasks
Агрегатные функции
GROUP BY и HAVING
JOIN
Подзапросы
🔸 Advanced SQL Tasks (продвинутые)
Оконные функции (Window Functions)
CTE
Очистка данных
👉 @SQLPortal
Создание таблицы
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100),
department VARCHAR(50),
salary INT
);
Вставка данных в таблицу
INSERT INTO employees VALUES
(1, 'John Doe', 'Finance', ...);
Базовый SELECT
SELECT name, salary
FROM employees;
WHERE
SELECT *
FROM employees
WHERE salary > 40000;
ORDER BY
SELECT *
FROM employees
ORDER BY salary DESC;
LIMIT
SELECT *
FROM employees
LIMIT 5;
Запуск дашборда в Power BI / Tableau на SQL-данных
Выполнение SQL-запросов на датасетах:
> Chinook Database: https://github.com/lerocha/chinook-database
> IMDB data: https://imdb.com/interfaces/
Агрегатные функции
SELECT department, AVG(salary)
FROM employees
GROUP BY department;
GROUP BY и HAVING
SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING COUNT(*) > 2;
JOIN
SELECT e.name, d.location
FROM employees e
JOIN departments d
ON e.department = d.name;
Подзапросы
SELECT name
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);
Оконные функции (Window Functions)
SELECT name, salary,
RANK() OVER (
PARTITION BY department
ORDER BY salary DESC
) AS dept_rank
FROM employees;
CTE
WITH high_earners AS (
SELECT *
FROM employees
WHERE salary > 50000
)
SELECT *
FROM high_earners;
Очистка данных
SELECT TRIM(LOWER(name)) AS cleaned_name
FROM employees;
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11🔥2
Полный список формул и ярлыков Excel.
1. Сумма диапазона
2. Сумма через "+"
3. Сумма констант
4. Произведение диапазона
5. Произведение ячеек
6. Произведение констант
7. Вычитание
8. Деление
9. Проценты
10. Максимум
11. Минимум
12. Возведение в степень
13. Среднее значение
14. Квадратный корень
15. Подсчёт непустых ячеек
16. Подсчёт пустых ячеек
17. Подсчёт по условию
18. Текущие дата и время
19. Сегодняшняя дата
20. День месяца (текущий)
21. Месяц (текущий)
22. Год (текущий)
23. Вставить текущую дату
24. Вставить текущее время
25. Вставить текущие дату и время
26. Проверка зачёта (IF)
👉 @SQLPortal
1. Сумма диапазона
=SUM(A1:A5)
2. Сумма через "+"
=(A1+A2+A3+A4+A5)
3. Сумма констант
=(45+243+48)
4. Произведение диапазона
=PRODUCT(F1:F2)
5. Произведение ячеек
=(B3*B4*B5)
6. Произведение констант
=(34*65)
7. Вычитание
=(E3-E4)
8. Деление
=(F3/F4)
9. Проценты
=(G3/G4*100)
10. Максимум
=MAX(H3:M3)
11. Минимум
=MIN(H3:M3)
12. Возведение в степень
=POWER(2,4) → 16
13. Среднее значение
=AVERAGE(C3:C14)
14. Квадратный корень
=SQRT(25)
15. Подсчёт непустых ячеек
=COUNT(C4:P4)
16. Подсчёт пустых ячеек
=COUNTBLANK(C3:C16)
17. Подсчёт по условию
=COUNTIF(D4:Z4, "P")
18. Текущие дата и время
=NOW()
19. Сегодняшняя дата
=TODAY()
20. День месяца (текущий)
=DAY(NOW())
21. Месяц (текущий)
=MONTH(NOW())
22. Год (текущий)
=YEAR(NOW())
23. Вставить текущую дату
CTRL + ;
24. Вставить текущее время
CTRL + SHIFT + ;
25. Вставить текущие дату и время
CTRL + ; затем пробел, затем CTRL + SHIFT + ;
26. Проверка зачёта (IF)
=IF(H4>=400, "PASS", "FAIL")
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12👍7🔥4
Postgres
Многие, кто работает с Postgres, хорошо знакомы с конструкцией
Читать: тык
👉 @SQLPortal
MERGE
это давно ожидаемая фича, которая появилась в Postgres 15. MERGE
используется для реализации upsert-логики (то есть insert или update).Многие, кто работает с Postgres, хорошо знакомы с конструкцией
INSERT ... ON CONFLICT
. Но INSERT ... ON CONFLICT
не подходит для сценариев с условной логикой, где нужно использовать WHERE
, чтобы определить, что именно обновлять.Читать: тык
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4❤3
This media is not supported in your browser
VIEW IN TELEGRAM
Ой... CPU забито на 100%... Что случилось? Это аналитик написал рекурсивный CTE и забыл лимит поставить? Жесть… что-то крутится, и это нужно срочно остановить. Давайте зайдём в Postgres, найдём и убьём runaway-транзакцию.
Для начала посмотрим на системную таблицу активности Postgres —
Важно: при запросе к pg_stat_activity нужно отфильтровать свою собственную сессию. Её PID можно получить через
Так что запрос, который покажет все активные транзакции, кроме вашей:
Нашли "виновника"? Окей, теперь можно прибить процесс:
Но имей в виду: если ты вызываешь
В таком случае произойдёт откат (rollback), и в зависимости от конфигурации системы это может привести к потере данных.
После того как ты спас базу от перегрева, застрахуйся от runaway-запросов в будущем, выставив
👉 @SQLPortal
Для начала посмотрим на системную таблицу активности Postgres —
pg_stat_activity
. В ней отображаются все работающие backend-процессы (каждый со своим pid):SELECT * FROM pg_stat_activity;
Важно: при запросе к pg_stat_activity нужно отфильтровать свою собственную сессию. Её PID можно получить через
pg_backend_pid()
.Так что запрос, который покажет все активные транзакции, кроме вашей:
SELECT * FROM pg_stat_activity WHERE pid <> pg_backend_pid();
Нашли "виновника"? Окей, теперь можно прибить процесс:
SELECT pg_terminate_backend(pid);
Но имей в виду: если ты вызываешь
pg_terminate_backend
, это может быть транзакция с незакоммиченными изменениями.В таком случае произойдёт откат (rollback), и в зависимости от конфигурации системы это может привести к потере данных.
После того как ты спас базу от перегрева, застрахуйся от runaway-запросов в будущем, выставив
statement_timeout
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍4
SQL-вопрос на собеседовании для Data Engineer'ов (сможешь решить?)
Social Media PII
Социальная медиа-компания ведёт таблицу с информацией о пользователях, включая email-адреса и номера телефонов. Твоя задача написать функцию, которая обрабатывает эти данные для целей приватности и аналитики.
Твоя задача
—> Напиши функцию, которая выполняет следующие преобразования над входным DataFrame:
✅ Извлечение домена из email: Из поля
✅ Анонимизация номера телефона: Замаскируй первые 6 цифр номера телефона с помощью символов
Результат должен включать следующие колонки:
Отсортируй результат по номеру телефона по возрастанию (до маскировки)
Схема входных данных
Имя DataFrame:
| Название | Тип |
|------------------|------------|
| user_id | String |
| email | String |
| phone | Integer |
Схема выходных данных
| Название колонки | Тип |
|---------------------------|------------|
| anon_phone | String |
| email_domain | String |
| user_id | Integer |
Реши задачу здесь
👉 @SQLPortal
Social Media PII
Социальная медиа-компания ведёт таблицу с информацией о пользователях, включая email-адреса и номера телефонов. Твоя задача написать функцию, которая обрабатывает эти данные для целей приватности и аналитики.
Твоя задача
—> Напиши функцию, которая выполняет следующие преобразования над входным DataFrame:
email
извлеки доменное имя (текст после символа @
). *
, оставив только последние 4 цифры.Результат должен включать следующие колонки:
anon_phone
: Анонимизированный номер телефона (например, ******1234
) email_domain
: Извлечённый домен (например, example.com
) user_id
: Исходный user_id
Отсортируй результат по номеру телефона по возрастанию (до маскировки)
Схема входных данных
Имя DataFrame:
input_df
| Название | Тип |
|------------------|------------|
| user_id | String |
| email | String |
| phone | Integer |
Схема выходных данных
| Название колонки | Тип |
|---------------------------|------------|
| anon_phone | String |
| email_domain | String |
| user_id | Integer |
Реши задачу здесь
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍3
Data-engineer-handbook
Это репозиторий сo ссылками на всё, что вы когда-либо захотите изучить по data engineering
Github : https://github.com/DataExpert-io/data-engineer-handbook
😳 😳 😳
👉 @SQLPortal
Это репозиторий сo ссылками на всё, что вы когда-либо захотите изучить по data engineering
Github : https://github.com/DataExpert-io/data-engineer-handbook
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10
Новичкам в Postgres — разберитесь с основами создания таблиц: первичные ключи, внешние ключи и типы данных, всё это в oбучающем гайде
-- https://www.crunchydata.com/developers/playground/postgres-tutorial-create-tables
👉 @SQLPortal
-- https://www.crunchydata.com/developers/playground/postgres-tutorial-create-tables
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
This media is not supported in your browser
VIEW IN TELEGRAM
Бомбический инструмент для работы с SQL-базами данных
Исследуй, работай с таблицами и получай аналитику прямо из них.
Поддерживает MySQL, PostgreSQL, SQLite и другие.
Бесплатный и с открытым исходным кодом:
→ http://github.com/frectonz/sql-studio
👉 @SQLPortal
Исследуй, работай с таблицами и получай аналитику прямо из них.
Поддерживает MySQL, PostgreSQL, SQLite и другие.
Бесплатный и с открытым исходным кодом:
→ http://github.com/frectonz/sql-studio
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2
Совет по работе с JSON в Postgres: используйте
Результат запроса будет выглядеть так:
Это удобно, когда нужно быстро прочитать содержимое jsonb-поля, например, при отладке или анализе данных в консоли.
👉 @SQLPortal
jsonb_pretty
для форматирования JSON-поля в читаемый и структурированный вид с отступами.SELECT
id,
username,
jsonb_pretty(profile) AS pretty_profile
FROM
users;
Результат запроса будет выглядеть так:
id | username | pretty_profile
----+----------+------------------------------------------------
1 | jdoe | {
| | "age": 30,
| | "name": "John Doe",
| | "address": {
| | "city": "Anytown",
| | "street": "123 Main St"
| | },
| | "courses": [
| | {
| | "title": "History",
| | "credits": 3
| | },
| | {
| | "title": "Math",
| | "credits": 4
| | }
| | ],
| | "isStudent": false
| | }
Это удобно, когда нужно быстро прочитать содержимое jsonb-поля, например, при отладке или анализе данных в консоли.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍4