💡 SQL: группировка по неделям
Иногда нужно посчитать статистику не по дням, а по неделям.
Для этого можно использовать функции работы с датами.
🔎 Так можно быстро увидеть динамику заказов по неделям.
Аналогично работает и для
Иногда нужно посчитать статистику не по дням, а по неделям.
Для этого можно использовать функции работы с датами.
-- PostgreSQL
SELECT
DATE_TRUNC('week', order_date) AS week_start,
COUNT(*) AS orders_count
FROM orders
GROUP BY DATE_TRUNC('week', order_date)
ORDER BY week_start;
-- MySQL
SELECT
YEARWEEK(order_date, 1) AS year_week,
COUNT(*) AS orders_count
FROM orders
GROUP BY YEARWEEK(order_date, 1)
ORDER BY year_week;
🔎 Так можно быстро увидеть динамику заказов по неделям.
Аналогично работает и для
month, quarter, year.👍14🔥4❤3
This media is not supported in your browser
VIEW IN TELEGRAM
🦆 Крутой интерактивный тренажёр по SQL
Учитесь писать SQL-запросы через игру:
- Пошаговые уроки с живым редактором — пишешь код и сразу видишь результат.
- Задачи и мини-квесты, где вы помогаете Дакберту пробираться сквозь потоки данных.
- Работает бесплатно, прямо в браузере или на телефоне.
🎮 Попробовать: https://dbquacks.com/
Учитесь писать SQL-запросы через игру:
- Пошаговые уроки с живым редактором — пишешь код и сразу видишь результат.
- Задачи и мини-квесты, где вы помогаете Дакберту пробираться сквозь потоки данных.
- Работает бесплатно, прямо в браузере или на телефоне.
🎮 Попробовать: https://dbquacks.com/
👍9🔥3❤2😁2🤨1
Forwarded from Machine learning Interview
❌ Классический поиск по ключевым словам даёт ограниченные результаты.
В примере выше, такой селективный нашел только одно совпадение: "Machine Learning Overview".
✅ А вот pgvector ищет по смыслу и находит связанные концепции.
Пример запроса возвращает 5 релевантных документов:
– Machine Learning Overview
– Data Mining Basics
– Introduction to AI
– Deep Learning Guide
Семантический поиск > ключевого 🔥
@machinelearning_interview
В примере выше, такой селективный нашел только одно совпадение: "Machine Learning Overview".
✅ А вот pgvector ищет по смыслу и находит связанные концепции.
Пример запроса возвращает 5 релевантных документов:
– Machine Learning Overview
– Data Mining Basics
– Introduction to AI
– Deep Learning Guide
Семантический поиск > ключевого 🔥
@machinelearning_interview
❤3🔥2😁2👍1🤨1
💡 SQL: фильтрация по агрегатам с HAVING !!!
Иногда нужно отобрать только те группы, которые удовлетворяют условию по агрегату.
Для этого используется
🔎 Так можно сразу выбрать клиентов, у которых больше 5 заказов и общая сумма превышает 1000.
HAVING работает с SUM(), COUNT(), AVG(), MAX() и другими агрегатами.
Иногда нужно отобрать только те группы, которые удовлетворяют условию по агрегату.
Для этого используется
HAVING — он применяется после GROUP BY.
SELECT
customer_id,
COUNT(order_id) AS orders_count,
SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 1000
AND COUNT(order_id) >= 5;
🔎 Так можно сразу выбрать клиентов, у которых больше 5 заказов и общая сумма превышает 1000.
HAVING работает с SUM(), COUNT(), AVG(), MAX() и другими агрегатами.
👍14❤3🔥3
Microsoft SQL Interview Question — разбор №2: Early Responders
Задача: найти топ-3 пользователей, которые чаще всего отвечали на сообщения в течение 5 минут в августе 2022.
Нужно вывести их sender_id и число «быстрых ответов».
Данные: таблица messages(message_id, sender_id, receiver_id, content, sent_date).
Подход:
— Фильтруем август полуинтервалом [2022-08-01, 2022-09-01).
— Группируем переписку по паре пользователей (conv_id = min(sender,receiver)–max(sender,receiver)).
— Используем LAG по conv_id, чтобы взять предыдущее сообщение в диалоге.
— Быстрый ответ — когда направление сменилось и прошло ≤ 5 минут.
Решение (T-SQL):
Вариант с учётом ничьих (возьмёт всех на 1-3 местах):
Почему так:
— Диапазон дат без функций сохраняет использование индекса по sent_date.
— LAG по conv_id гарантирует, что сравниваем соседние сообщения в одном диалоге.
— Проверяем смену направления (sender_id ≠ prev_sender) и порог по времени (≤ 5 минут).
Задача: найти топ-3 пользователей, которые чаще всего отвечали на сообщения в течение 5 минут в августе 2022.
Нужно вывести их sender_id и число «быстрых ответов».
Данные: таблица messages(message_id, sender_id, receiver_id, content, sent_date).
Подход:
— Фильтруем август полуинтервалом [2022-08-01, 2022-09-01).
— Группируем переписку по паре пользователей (conv_id = min(sender,receiver)–max(sender,receiver)).
— Используем LAG по conv_id, чтобы взять предыдущее сообщение в диалоге.
— Быстрый ответ — когда направление сменилось и прошло ≤ 5 минут.
Решение (T-SQL):
WITH aug AS (
SELECT message_id, sender_id, receiver_id, sent_date
FROM messages
WHERE sent_date >= '2022-08-01'
AND sent_date < '2022-09-01'
),
conv AS (
SELECT *,
CONCAT(
IIF(sender_id < receiver_id, sender_id, receiver_id), '-',
IIF(sender_id < receiver_id, receiver_id, sender_id)
) AS conv_id
FROM aug
),
seq AS (
SELECT *,
LAG(sender_id) OVER (PARTITION BY conv_id ORDER BY sent_date, message_id) AS prev_sender,
LAG(sent_date) OVER (PARTITION BY conv_id ORDER BY sent_date, message_id) AS prev_time
FROM conv
),
fast AS (
SELECT sender_id
FROM seq
WHERE prev_sender IS NOT NULL
AND sender_id <> prev_sender
AND DATEDIFF(minute, prev_time, sent_date) <= 5
)
SELECT TOP (3)
sender_id,
COUNT(*) AS fast_reply_count
FROM fast
GROUP BY sender_id
ORDER BY COUNT(*) DESC, sender_id;
Вариант с учётом ничьих (возьмёт всех на 1-3 местах):
WITH aug AS (
SELECT message_id, sender_id, receiver_id, sent_date
FROM messages
WHERE sent_date >= '2022-08-01'
AND sent_date < '2022-09-01'
),
conv AS (
SELECT *,
CONCAT(
IIF(sender_id < receiver_id, sender_id, receiver_id), '-',
IIF(sender_id < receiver_id, receiver_id, sender_id)
) AS conv_id
FROM aug
),
seq AS (
SELECT *,
LAG(sender_id) OVER (PARTITION BY conv_id ORDER BY sent_date, message_id) AS prev_sender,
LAG(sent_date) OVER (PARTITION BY conv_id ORDER BY sent_date, message_id) AS prev_time
FROM conv
),
fast AS (
SELECT sender_id
FROM seq
WHERE prev_sender IS NOT NULL
AND sender_id <> prev_sender
AND DATEDIFF(minute, prev_time, sent_date) <= 5
),
agg AS (
SELECT sender_id, COUNT(*) AS fast_reply_count
FROM fast
GROUP BY sender_id
),
ranked AS (
SELECT sender_id, fast_reply_count,
DENSE_RANK() OVER (ORDER BY fast_reply_count DESC) AS rnk
FROM agg
)
SELECT sender_id, fast_reply_count
FROM ranked
WHERE rnk <= 3
ORDER BY fast_reply_count DESC, sender_id;
Почему так:
— Диапазон дат без функций сохраняет использование индекса по sent_date.
— LAG по conv_id гарантирует, что сравниваем соседние сообщения в одном диалоге.
— Проверяем смену направления (sender_id ≠ prev_sender) и порог по времени (≤ 5 минут).
👍8❤3😁2🥰1🤨1😭1
Better Database Design 💡
Чтобы повысить безопасность и упростить управление доступом, используйте логическую изоляцию с помощью схем.
Пример: создаём отдельную схему и выделяем для неё пользователя, у которого доступ только к своей области данных.
⚡ Идея проста:
Создавайте отдельного пользователя для каждой схемы и используйте разные connection string в приложении. Это уменьшает риски и делает архитектуру чище.
Чтобы повысить безопасность и упростить управление доступом, используйте логическую изоляцию с помощью схем.
Пример: создаём отдельную схему и выделяем для неё пользователя, у которого доступ только к своей области данных.
CREATE SCHEMA Orders;
CREATE SCHEMA Shipping;
-- Orders module can only access its schema
CREATE USER OrdersUser WITH DEFAULT_SCHEMA = Orders;
GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::Orders TO OrdersUser;
-- Shipping module can only access its schema
CREATE USER ShippingUser WITH DEFAULT_SCHEMA = Shipping;
GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::Shipping TO ShippingUser;
⚡ Идея проста:
Создавайте отдельного пользователя для каждой схемы и используйте разные connection string в приложении. Это уменьшает риски и делает архитектуру чище.
👍8❤2🔥1
🗄️ SQL-редактор в браузере
Запускается как Go HTTP-сервер и открывается прямо в браузере.
Подходит для простых ETL-задач:
- перенос данных между базами
- работа с Excel-таблицами
- поддержка JSON и CSV
⚡ Удобный инструмент, когда нужно быстро и без лишних настроек управлять данными.
👉 https://github.com/a-le/db-portal
#golang
Запускается как Go HTTP-сервер и открывается прямо в браузере.
Подходит для простых ETL-задач:
- перенос данных между базами
- работа с Excel-таблицами
- поддержка JSON и CSV
⚡ Удобный инструмент, когда нужно быстро и без лишних настроек управлять данными.
👉 https://github.com/a-le/db-portal
#golang
❤1
📊 Top 6 Python libraries for visualization — which one to use?
CodeCut подготовили обзор лучших инструментов для работы с графиками и визуализацией в Python.
Разбираем плюсы и минусы, где каждая библиотека раскрывается сильнее всего.
Полный список и разбор: https://codecut.ai/top-6-python-libraries-for-visualization-which-one-to-use/
🐍 Если работаете с данными и графиками в Python — must read!
CodeCut подготовили обзор лучших инструментов для работы с графиками и визуализацией в Python.
Разбираем плюсы и минусы, где каждая библиотека раскрывается сильнее всего.
Полный список и разбор: https://codecut.ai/top-6-python-libraries-for-visualization-which-one-to-use/
🐍 Если работаете с данными и графиками в Python — must read!
👍7❤2🥰2
🔥 Успех в IT = скорость + знания + окружение
Здесь ты найдёшь всё это — коротко, по делу и без воды.
Пока другие ищут, где “подглядеть решение”, ты уже используешь самые свежие инструменты!
AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Собеседования DS: t.me/machinelearning_interview
C++ t.me/cpluspluc
Docker: t.me/DevopsDocker
Хакинг: t.me/linuxkalii
Devops: t.me/DevOPSitsec
Data Science: t.me/data_analysis_ml
Javascript: t.me/javascriptv
C#: t.me/csharp_1001_notes
Java: t.me/java_library
Базы данных: t.me/sqlhub
Python собеседования: t.me/python_job_interview
Мобильная разработка: t.me/mobdevelop
Golang: t.me/Golang_google
React: t.me/react_tg
Rust: t.me/rust_code
ИИ: t.me/vistehno
PHP: t.me/phpshka
Android: t.me/android_its
Frontend: t.me/front
Big Data: t.me/bigdatai
МАТЕМАТИКА: t.me/data_math
Kubernets: t.me/kubernetc
Разработка игр: https://t.me/gamedev
Haskell: t.me/haskell_tg
Физика: t.me/fizmat
💼 Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.me/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://t.me/addlist/mzMMG3RPZhY2M2Iy
😆ИТ-Мемы: t.me/memes_prog
🇬🇧Английский: t.me/english_forprogrammers
🧠ИИ: t.me/vistehno
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://t.me/addlist/BkskQciUW_FhNjEy
Подпишись, если хочешь быть в числе тех, кого зовут в топовые проекты!
Здесь ты найдёшь всё это — коротко, по делу и без воды.
Пока другие ищут, где “подглядеть решение”, ты уже используешь самые свежие инструменты!
AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Собеседования DS: t.me/machinelearning_interview
C++ t.me/cpluspluc
Docker: t.me/DevopsDocker
Хакинг: t.me/linuxkalii
Devops: t.me/DevOPSitsec
Data Science: t.me/data_analysis_ml
Javascript: t.me/javascriptv
C#: t.me/csharp_1001_notes
Java: t.me/java_library
Базы данных: t.me/sqlhub
Python собеседования: t.me/python_job_interview
Мобильная разработка: t.me/mobdevelop
Golang: t.me/Golang_google
React: t.me/react_tg
Rust: t.me/rust_code
ИИ: t.me/vistehno
PHP: t.me/phpshka
Android: t.me/android_its
Frontend: t.me/front
Big Data: t.me/bigdatai
МАТЕМАТИКА: t.me/data_math
Kubernets: t.me/kubernetc
Разработка игр: https://t.me/gamedev
Haskell: t.me/haskell_tg
Физика: t.me/fizmat
💼 Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.me/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://t.me/addlist/mzMMG3RPZhY2M2Iy
😆ИТ-Мемы: t.me/memes_prog
🇬🇧Английский: t.me/english_forprogrammers
🧠ИИ: t.me/vistehno
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://t.me/addlist/BkskQciUW_FhNjEy
Подпишись, если хочешь быть в числе тех, кого зовут в топовые проекты!
❤2👍1
⚡ SQL совет
Часто нужно выбрать последнее значение для каждой группы (например, последний заказ клиента)?
Вместо
Вариант 1 — PostgreSQL `DISTINCT ON`
Берёт по одной строке на user_id, оставляя самую свежую по дате.
Вариант 2 — универсальный (SQL Server, MySQL 8+, Oracle)
📌 Работает во всех СУБД с оконными функциями — гибко и читаемо.
@databases_tg
Часто нужно выбрать последнее значение для каждой группы (например, последний заказ клиента)?
Вместо
MAX(date) с подзапросами используйте `DISTINCT ON` (в PostgreSQL) или оконные функции. Вариант 1 — PostgreSQL `DISTINCT ON`
SELECT DISTINCT ON (user_id)
user_id, order_id, created_at
FROM orders
ORDER BY user_id, created_at DESC;
Берёт по одной строке на user_id, оставляя самую свежую по дате.
Вариант 2 — универсальный (SQL Server, MySQL 8+, Oracle)
WITH ranked AS (
SELECT
user_id,
order_id,
created_at,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rn
FROM orders
)
SELECT user_id, order_id, created_at
FROM ranked
WHERE rn = 1;
📌 Работает во всех СУБД с оконными функциями — гибко и читаемо.
@databases_tg
🔥11👍8❤2🥰1
🚀 Postgres 18 получил нативную поддержку UUID v7!
🔑 Что такое UUID?
UUID (Universally Unique Identifier) — это уникальный идентификатор, который часто используют вместо автоинкрементных ID. Пример:
✨ Почему именно v7:
- Основан на времени → значения идут по порядку
- Меньше нагрузки на индексы
- Быстрее вставка и чтение записей
- Оптимально для высоконагруженных систем
⚡ Итог: базы на PostgreSQL станут быстрее и стабильнее при работе с большими объёмами данных.
🔑 Что такое UUID?
UUID (Universally Unique Identifier) — это уникальный идентификатор, который часто используют вместо автоинкрементных ID. Пример:
550e8400-e29b-41d4-a716-446655440000. ✨ Почему именно v7:
- Основан на времени → значения идут по порядку
- Меньше нагрузки на индексы
- Быстрее вставка и чтение записей
- Оптимально для высоконагруженных систем
⚡ Итог: базы на PostgreSQL станут быстрее и стабильнее при работе с большими объёмами данных.
👍10❤4🔥3
🔥 7 бесплатных интерактивов для аналитиков
Эти сервисы — не просто игрушки, а мощные симуляторы, которые помогают прокачивать аналитику через практику.
Они отлично подходят для подготовки к собеседованиям, изучения новых концепций или просто для того, чтобы «залипнуть» с пользой.
Вот подборка, в которую я сам возвращаюсь снова и снова:
1️⃣ Симулятор стартапа — teachmegrow.com
2️⃣ A/B-тесты на практике — lukasvermeer.nl/confidence
3️⃣ Эволюция доверия — notdotteam.github.io/trust
4️⃣ UX-игра на внимательность — cantunsee.space
5️⃣ UX Arcade — uxcel.com/arcade
6️⃣ Вероятности и статистика на пальцах — seeing-theory.brown.edu
7️⃣ Алгоритмы в картинках — visualgo.net
💡 Сохраняйте, проходите и делитесь с коллегами — это реально полезный интерактив.
Эти сервисы — не просто игрушки, а мощные симуляторы, которые помогают прокачивать аналитику через практику.
Они отлично подходят для подготовки к собеседованиям, изучения новых концепций или просто для того, чтобы «залипнуть» с пользой.
Вот подборка, в которую я сам возвращаюсь снова и снова:
1️⃣ Симулятор стартапа — teachmegrow.com
2️⃣ A/B-тесты на практике — lukasvermeer.nl/confidence
3️⃣ Эволюция доверия — notdotteam.github.io/trust
4️⃣ UX-игра на внимательность — cantunsee.space
5️⃣ UX Arcade — uxcel.com/arcade
6️⃣ Вероятности и статистика на пальцах — seeing-theory.brown.edu
7️⃣ Алгоритмы в картинках — visualgo.net
💡 Сохраняйте, проходите и делитесь с коллегами — это реально полезный интерактив.
❤6👍2🔥2🤯1
This media is not supported in your browser
VIEW IN TELEGRAM
📦 AM (Application Manager) — универсальная база и решение для управления всеми AppImage и портативными приложениями в GNU/Linux!
AM упрощает жизнь пользователям Linux, позволяя:
- 🔹 Интегрировать AppImages в систему или локально (с флагом `--user`)
- 🔹 Управлять приложениями прямо из командной строки
- 🔹 Автоматически добавлять программы в меню приложений
- 🔹 Обновлять установленные AppImages и даже собирать их «на лету» как AUR-хелпер
🛠️ Как работает AM:
1. Создаёт базовые каталоги и скрипт удаления
2. Загружает пакет
3. Создаёт файл версии и скрипт обновления
4. При необходимости извлекает иконки и `.desktop`-файлы для удобной интеграции
И всё это максимально просто и быстро — без лишних зависимостей и громоздких менеджеров.
👉 Репозиторий: https://github.com/ivan-hc/AM
AM упрощает жизнь пользователям Linux, позволяя:
- 🔹 Интегрировать AppImages в систему или локально (с флагом `--user`)
- 🔹 Управлять приложениями прямо из командной строки
- 🔹 Автоматически добавлять программы в меню приложений
- 🔹 Обновлять установленные AppImages и даже собирать их «на лету» как AUR-хелпер
🛠️ Как работает AM:
1. Создаёт базовые каталоги и скрипт удаления
2. Загружает пакет
3. Создаёт файл версии и скрипт обновления
4. При необходимости извлекает иконки и `.desktop`-файлы для удобной интеграции
И всё это максимально просто и быстро — без лишних зависимостей и громоздких менеджеров.
👉 Репозиторий: https://github.com/ivan-hc/AM
❤3👍3🥰1
Возможно ли использование одновременно двух агрегирующих функций? Пример:
SELECT MIN(price), MAX(price) FROM Orders;
SELECT MIN(price), MAX(price) FROM Orders;
Anonymous Quiz
19%
Да, но данный запрос составлен неверно, надо так: SELECT * FROM Orders WHERE price IN (MIN, MAX);
61%
Да, в результате мы получим минимальную и максимальную стоимости
5%
Да, в результате мы получим стоимости, отсортированные от минимальной к максимальной
15%
Нет, две функции использовать одновременно нельзя
❤4🔥3🥰2
Введение. Собеседования на позиции, связанные с данными (аналитики, инженеры, ученые данных), всё чаще включают нестандартные и продвинутые вопросы по SQL.
Большие технологические компании (Google, Amazon и др.) предъявляют высокие требования: важна не только правильность запроса, но и умение оптимизировать его и разбираться в реальных бизнес-данных.
В этом гайде мы разберем категории наиболее распространенных сложных SQL-задач с реальных собеседований – от платформ вроде DataLemur, LeetCode, StrataScratch – и подробно поясним решения.
Каждая задача сопровождена анализом: условие, оптимальный подход, используемые SQL-конструкции, возможные ошибки и финальное решение (для PostgreSQL и MySQL, с указанием различий где необходимо).
В конце добавлен отдельный раздел о современных базах данных, включая векторные БД (Pinecone, Weaviate, Milvus и др.), с примерами того, что могут спросить про них на собеседовании и как выглядят SQL-подобные запросы для работы с векторами.
📌 Читать гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍5🔥3
⚡️ Топ-10 наиболее популярных опенсорсных баз данных: на заметку разработчику
1️⃣ MySQL
2️⃣ PostgreSQL
3️⃣ MariaDB
4️⃣ Apache Cassandra
5️⃣ Neo4j
6️⃣ SQLite
7️⃣ CockroachDB
8️⃣ Redis
9️⃣ MongoDB
🔟 Couchbase
#инфографика
1️⃣ MySQL
2️⃣ PostgreSQL
3️⃣ MariaDB
4️⃣ Apache Cassandra
5️⃣ Neo4j
6️⃣ SQLite
7️⃣ CockroachDB
8️⃣ Redis
9️⃣ MongoDB
🔟 Couchbase
#инфографика
🔥9👍3🥰1
📊 Анализ Данных Alibaba: Оптимизация Хранения Сжатых Файлов
Введение
В Alibaba, где ежедневно генерируются петабайты данных, эффективное хранение критически важно. Оно не только снижает затраты, но и ускоряет работу систем.
Сегодня мы разберём задачу по оптимизации хранения сжатых файлов, имитирующую реальные сценарии Alibaba.
🎯 Цель — определить сжатые файлы и рассчитать общую экономию памяти.
Постановка Задачи
Дана таблица
- file_id — идентификатор файла
- file_type — тип файла
- file_size — исходный размер в байтах
- compressed_size — размер после сжатия (`NULL`, если файл не сжат)
Задачи:
1. Найти все сжатые файлы (`compressed_size IS NOT NULL`).
2. Для каждого сжатого файла вывести
3. Вычислить и вывести общую экономию места:
Пример Данных
| file_id | file_type | file_size | compressed_size |
|---------|-----------|-----------|-----------------|
| 1 | image | 1000 | 600 |
| 2 | video | 5000 | NULL |
| 3 | document | 200 | 100 |
| 4 | image | 1500 | 700 |
Решение
🔹 Шаг 1. Идентификация Сжатых Файлов
Фильтруем только те строки, где
Результат для примера:
file_id file_type
1 image
3 document
4 image
🔹 Шаг 2. Вычисление Общей Экономии Места
Суммируем разницу между исходным и сжатым размером:
Промежуточные расчёты:
- Файл 1: 1000 - 600 = 400
- Файл 3: 200 - 100 = 100
- Файл 4: 1500 - 700 = 800
Общая экономия: 400 + 100 + 800 = 1300
Результат запроса:
- total_space_saved: 1300
Итоговое Решение
Обычно на платформах типа DataLemur ожидаются два отдельных запроса:
1. Список сжатых файлов
2. Общая экономия
💰 В чем плюс такой методики — меньше данных → меньше расходов на хранение и трафик. В масштабе Alibaba это миллионы долларов.
📊 Мониторинг эффективности — можно оценить, насколько хорошо работают алгоритмы сжатия.
📦 Планирование ёмкости — точный прогноз потребностей в хранилище.
⚡ Повышение производительности — сжатые файлы быстрее передаются и обрабатываются.
Эта задача показывает, как простые SQL-запросы решают ключевые задачи оптимизации Big Data.
Понимание подобных принципов помогает инженерам данных:
- рационально использовать ресурсы,
- снижать расходы,
- повышать эффективность работы систем.
📌 Задача
Введение
В Alibaba, где ежедневно генерируются петабайты данных, эффективное хранение критически важно. Оно не только снижает затраты, но и ускоряет работу систем.
Сегодня мы разберём задачу по оптимизации хранения сжатых файлов, имитирующую реальные сценарии Alibaba.
🎯 Цель — определить сжатые файлы и рассчитать общую экономию памяти.
Постановка Задачи
Дана таблица
files со столбцами:- file_id — идентификатор файла
- file_type — тип файла
- file_size — исходный размер в байтах
- compressed_size — размер после сжатия (`NULL`, если файл не сжат)
Задачи:
1. Найти все сжатые файлы (`compressed_size IS NOT NULL`).
2. Для каждого сжатого файла вывести
file_id и file_type. 3. Вычислить и вывести общую экономию места:
экономия = file_size - compressed_size.Пример Данных
| file_id | file_type | file_size | compressed_size |
|---------|-----------|-----------|-----------------|
| 1 | image | 1000 | 600 |
| 2 | video | 5000 | NULL |
| 3 | document | 200 | 100 |
| 4 | image | 1500 | 700 |
Решение
🔹 Шаг 1. Идентификация Сжатых Файлов
Фильтруем только те строки, где
compressed_size не равен NULL:
SELECT
file_id,
file_type
FROM
files
WHERE
compressed_size IS NOT NULL;
Результат для примера:
file_id file_type
1 image
3 document
4 image
🔹 Шаг 2. Вычисление Общей Экономии Места
Суммируем разницу между исходным и сжатым размером:
SELECT
SUM(file_size - compressed_size) AS total_space_saved
FROM
files
WHERE
compressed_size IS NOT NULL;
Промежуточные расчёты:
- Файл 1: 1000 - 600 = 400
- Файл 3: 200 - 100 = 100
- Файл 4: 1500 - 700 = 800
Общая экономия: 400 + 100 + 800 = 1300
Результат запроса:
- total_space_saved: 1300
Итоговое Решение
Обычно на платформах типа DataLemur ожидаются два отдельных запроса:
1. Список сжатых файлов
SELECT
file_id,
file_type
FROM
files
WHERE
compressed_size IS NOT NULL;
2. Общая экономия
SELECT
SUM(file_size - compressed_size) AS total_space_saved
FROM
files
WHERE
compressed_size IS NOT NULL;
💰 В чем плюс такой методики — меньше данных → меньше расходов на хранение и трафик. В масштабе Alibaba это миллионы долларов.
📊 Мониторинг эффективности — можно оценить, насколько хорошо работают алгоритмы сжатия.
📦 Планирование ёмкости — точный прогноз потребностей в хранилище.
⚡ Повышение производительности — сжатые файлы быстрее передаются и обрабатываются.
Эта задача показывает, как простые SQL-запросы решают ключевые задачи оптимизации Big Data.
Понимание подобных принципов помогает инженерам данных:
- рационально использовать ресурсы,
- снижать расходы,
- повышать эффективность работы систем.
📌 Задача
👍5❤4🔥1🥰1
Forwarded from Golang
Разработчики выкатили pgschema — утилиту для декларативных миграций схемы в Postgres.
Теперь можно описывать схему как “источник правды”, сравнивать её с текущей и применять изменения безопасно — как в Terraform.
- dump — снимаем слепок схемы
- plan — видим diff и список изменений
- apply — применяем миграции с контролем блокировок и таймаутов
- Поддержка Postgres 14-17
- Transaction-adaptive исполнение и dry-run режим
✨ Зачем нужно
- Порядок в быстро меняющейся схеме
- Прозрачные миграции через CI/CD
- Контроль DDL-операций без неожиданных простоев
- Удобно для gitops и командной разработки
👉 Репозиторий: https://github.com/pgschema/pgschema
@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍5🔥1
🔥 Beekeeper Studio — «убийца» DBeaver
SQL-редактор с открытым исходным кодом для MySQL, PostgreSQL, SQLite, SQL Server и других баз.
Доступен на Windows, macOS и Linux, удобный интерфейс со вкладками и всё, что нужно:
- 👥 Онлайн-коллаборация
- 📥 Импорт баз данных
- 🛠️ Создание таблиц в GUI
- 👀 Просмотр данных
- 🤖 Встроенный ИИ-копайлота
💰 Есть бесплатная Community Edition
https://www.beekeeperstudio.io/get
SQL-редактор с открытым исходным кодом для MySQL, PostgreSQL, SQLite, SQL Server и других баз.
Доступен на Windows, macOS и Linux, удобный интерфейс со вкладками и всё, что нужно:
- 👥 Онлайн-коллаборация
- 📥 Импорт баз данных
- 🛠️ Создание таблиц в GUI
- 👀 Просмотр данных
- 🤖 Встроенный ИИ-копайлота
💰 Есть бесплатная Community Edition
https://www.beekeeperstudio.io/get
👍10🔥5😁3❤1🥰1