SQL и Анализ данных
12.5K subscribers
605 photos
53 videos
3 files
633 links
Базы данных и всё, что с ними связано!

Сотрудничество: @haarrp

РКН № 6001430881
Download Telegram
🆕 PDF Arranger — лёгкий и удобный инструмент для работы с PDF.

Возможности:
- Объединение и разделение файлов
- Поворот и обрезка страниц
- Перестановка и удаление страниц
- Интуитивный drag-and-drop интерфейс

💻 Доступен для Linux, Windows (включая портативную версию) и BSD.
Полностью опенсорс (GPL-3.0).

Идеален, если нужно быстро подготовить PDF к печати или презентации — без сложных настроек.

📌 GitHub

#PDF #opensource #Linux #devtools
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍3🔥2
👨‍🔧 CoreNN — база данных для работы с векторами и эмбеддингами в масштабе миллиардов, с сублинейным временем отклика на обычных серверах.

📌 Пример: поиск по 1 млрд эмбеддингов комментариев Reddit из индекса 4,8 ТБ на диске занимает всего 15 мс.

🔧 Ключевые особенности:
- Работает на дешёвых SSD/flash-накопителях, а не в дорогой DRAM → в 40–100 раз дешевле.
- Масштабирование: от 1 до 1 млрд векторов в одном индексе.
- Upsert и delete оптимизируют локальный граф, освобождают место и сохраняют скорость — без полной перестройки.
- Поддерживает параллельные запросы и обновления без блокировок.

🔗 https://github.com/wilsonzlin/CoreNN
🔥72👍2
💡 SQL-трюк: фильтрация по "первому в группе"

Часто нужно взять только первую запись из каждой группы (например, последние покупки клиентов).
Мало кто знает, что это можно сделать без подзапросов с помощью ROW_NUMBER().


SELECT *
FROM (
SELECT
customer_id,
order_id,
order_date,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) AS rn
FROM orders
) t
WHERE rn = 1;


🔎 Здесь ROW_NUMBER() нумерует строки внутри каждой группы customer_id.
rn = 1 оставляет только самую свежую запись по каждому клиенту.
👍17😁53🔥3
💡 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.
👍123🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
🦆 Крутой интерактивный тренажёр по SQL

Учитесь писать SQL-запросы через игру:
- Пошаговые уроки с живым редактором — пишешь код и сразу видишь результат.
- Задачи и мини-квесты, где вы помогаете Дакберту пробираться сквозь потоки данных.
- Работает бесплатно, прямо в браузере или на телефоне.

🎮 Попробовать: https://dbquacks.com/
👍7🔥2😁21🤨1
Классический поиск по ключевым словам даёт ограниченные результаты.

В примере выше, такой селективный нашел только одно совпадение: "Machine Learning Overview".

А вот pgvector ищет по смыслу и находит связанные концепции.
Пример запроса возвращает 5 релевантных документов:
– Machine Learning Overview
– Data Mining Basics
– Introduction to AI
– Deep Learning Guide

Семантический поиск > ключевого 🔥

@machinelearning_interview
2😁2👍1🔥1🤨1
💡 SQL: фильтрация по агрегатам с HAVING !!!

Иногда нужно отобрать только те группы, которые удовлетворяют условию по агрегату.
Для этого используется 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() и другими агрегатами.
👍123🔥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):

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 минут).
👍73😁2🥰1🤨1😭1
Better Database Design 💡

Чтобы повысить безопасность и упростить управление доступом, используйте логическую изоляцию с помощью схем.

Пример: создаём отдельную схему и выделяем для неё пользователя, у которого доступ только к своей области данных.


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 в приложении. Это уменьшает риски и делает архитектуру чище.
👍62🔥1
🗄️ SQL-редактор в браузере

Запускается как 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!
👍72🥰2
🔥 Успех в IT = скорость + знания + окружение

Здесь ты найдёшь всё это — коротко, по делу и без воды.
Пока другие ищут, где “подглядеть решение”, ты уже используешь самые свежие инструменты!

AI: t.iss.one/ai_machinelearning_big_data
Python: t.iss.one/pythonl
Linux: t.iss.one/linuxacademiya
Собеседования DS: t.iss.one/machinelearning_interview
C++ t.iss.one/cpluspluc
Docker: t.iss.one/DevopsDocker
Хакинг: t.iss.one/linuxkalii
Devops: t.iss.one/DevOPSitsec
Data Science: t.iss.one/data_analysis_ml
Javascript: t.iss.one/javascriptv
C#: t.iss.one/csharp_1001_notes
Java: t.iss.one/java_library
Базы данных: t.iss.one/sqlhub
Python собеседования: t.iss.one/python_job_interview
Мобильная разработка: t.iss.one/mobdevelop
Golang: t.iss.one/Golang_google
React: t.iss.one/react_tg
Rust: t.iss.one/rust_code
ИИ: t.iss.one/vistehno
PHP: t.iss.one/phpshka
Android: t.iss.one/android_its
Frontend: t.iss.one/front
Big Data: t.iss.one/bigdatai
МАТЕМАТИКА: t.iss.one/data_math
Kubernets: t.iss.one/kubernetc
Разработка игр: https://t.iss.one/gamedev
Haskell: t.iss.one/haskell_tg
Физика: t.iss.one/fizmat

💼 Папка с вакансиями: t.iss.one/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.iss.one/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.iss.one/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.iss.one/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://t.iss.one/addlist/mzMMG3RPZhY2M2Iy

😆ИТ-Мемы: t.iss.one/memes_prog
🇬🇧Английский: t.iss.one/english_forprogrammers
🧠ИИ: t.iss.one/vistehno

🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://t.iss.one/addlist/BkskQciUW_FhNjEy

Подпишись, если хочешь быть в числе тех, кого зовут в топовые проекты!
2👍1
SQL совет

Часто нужно выбрать последнее значение для каждой группы (например, последний заказ клиента)?
Вместо 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
🔥10👍51🥰1
🚀 Postgres 18 получил нативную поддержку UUID v7!

🔑 Что такое UUID?
UUID (Universally Unique Identifier) — это уникальный идентификатор, который часто используют вместо автоинкрементных ID. Пример: 550e8400-e29b-41d4-a716-446655440000.

Почему именно v7:
- Основан на времени → значения идут по порядку
- Меньше нагрузки на индексы
- Быстрее вставка и чтение записей
- Оптимально для высоконагруженных систем

Итог: базы на PostgreSQL станут быстрее и стабильнее при работе с большими объёмами данных.
👍83🔥3