Прокачай навыки на задачах, которые встречаются в реальной работе.
Бот в Telegram помогает тренироваться каждый день: задания обновляются, сложность растёт, а ошибки разбираются.
✔ практические кейсы
✔ удобный эмулятор работы Аналитика бесплатно
✔ пополняем задачами с реальных собеседований
✔ собираем фидбек и улучшаем тренажёр вместе с вами
Готов работать с данными уверенно? Попробуй симулятор и расти как аналитик.
t.me/Analitics_databot
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍6❤5😁1
Бесплатный курс по Claude Code от Anthropic.
Внутри 15 лекций примерно по часу каждая. Обещают, что за это время ты разберёшься:
• как эффективно управлять контекстом и не «тратить» токены зря
• как расширять Claude Code через MCP-серверы
• как писать собственные хуки
• как подключать GitHub и автоматизировать ревью и рутинные задачи
В конце — дают сертификат вайбкодера, который можно показать маме 😁
Курс - хороший способ быстро понять, как превращать Claude Code из просто помощника в полноценного рабочего инструмента.
https://anthropic.skilljar.com/claude-code-in-action
Внутри 15 лекций примерно по часу каждая. Обещают, что за это время ты разберёшься:
• как эффективно управлять контекстом и не «тратить» токены зря
• как расширять Claude Code через MCP-серверы
• как писать собственные хуки
• как подключать GitHub и автоматизировать ревью и рутинные задачи
В конце — дают сертификат вайбкодера, который можно показать маме 😁
Курс - хороший способ быстро понять, как превращать Claude Code из просто помощника в полноценного рабочего инструмента.
https://anthropic.skilljar.com/claude-code-in-action
❤5👍2💊2🥰1
100 технических вопросов для интервью Data Analyst / Data Scientist (Middle/Senior)
В этом руководстве мы подробно разберем 100 реальных технических вопросов, которые часто встречаются на собеседованиях для аналитиков данных и специалистов по данным уровня middle и senior.
Вопросы сгруппированы по типам компаний (FAANG, стартапы, финтех, консалтинг), по уровню позиции (middle или senior) и по ключевым категориям знаний.
Используя этот гайд, вы сможете оценить свой уровень подготовки, понять глубину ответов, ожидаемую от опытных кандидатов, и избежать популярных ошибок. Давайте перейдем к вопросам. FAANG: Интервью в крупных технокомпаниях (FAANG – Amazon, Apple, Netflix, Google и аналогичные крупные IT-компании) Middle-уровень – FAANG
SQL – примеры вопросов (Middle, FAANG)
https://uproger.com/100-tehnicheskih-voprosov-dlya-intervyu-data-analyst-data-scientist-middle-senior/
В этом руководстве мы подробно разберем 100 реальных технических вопросов, которые часто встречаются на собеседованиях для аналитиков данных и специалистов по данным уровня middle и senior.
Вопросы сгруппированы по типам компаний (FAANG, стартапы, финтех, консалтинг), по уровню позиции (middle или senior) и по ключевым категориям знаний.
Используя этот гайд, вы сможете оценить свой уровень подготовки, понять глубину ответов, ожидаемую от опытных кандидатов, и избежать популярных ошибок. Давайте перейдем к вопросам. FAANG: Интервью в крупных технокомпаниях (FAANG – Amazon, Apple, Netflix, Google и аналогичные крупные IT-компании) Middle-уровень – FAANG
SQL – примеры вопросов (Middle, FAANG)
https://uproger.com/100-tehnicheskih-voprosov-dlya-intervyu-data-analyst-data-scientist-middle-senior/
❤7👍2🔥1
В этом бесплатном курсе вы шаг за шагом научитесь собирать данные с веб-сайтов с помощью Python. Мы начнём с основ парсинга (скрапинга) - автоматического сбора информации с веб-страниц – и постепенно перейдём к более продвинутым темам.
Материал разбит на модули с понятными примерами и практическими заданиями после каждой темы. Курс рассчитан на начинающих и продолжающих (junior/middle) разработчиков, знакомых с основами Python.
📌 Гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2😁1
✅ Как правильно разворачивать БАЗУ ДАННЫХ перед стартом любого проекта
Ошибки с БД на старте проекта потом стоят дороже всего:
плавающие миграции, разные схемы у команды, потерянные данные, “а у меня работает”.
Правильный подход простой - БД должна подниматься одинаково у всех:
локально, на CI и в проде.
Что делаем всегда:
1) Поднимаем БД через Docker (одинаковая среда для всех)
2) Храним все настройки в
3) Схема меняется только через миграции (Flyway / Liquibase / EF / Alembic)
4) Добавляем init-скрипты + seed данные (опционально)
5) Делаем healthcheck, чтобы сервис не стартовал раньше БД
6) Добавляем backup/restore команды (минимум — дамп)
Итог:
- один репозиторий = одна база
- любые изменения схемы воспроизводимы
- новый разработчик стартует за 3 минуты
Ошибки с БД на старте проекта потом стоят дороже всего:
плавающие миграции, разные схемы у команды, потерянные данные, “а у меня работает”.
Правильный подход простой - БД должна подниматься одинаково у всех:
локально, на CI и в проде.
Что делаем всегда:
1) Поднимаем БД через Docker (одинаковая среда для всех)
2) Храним все настройки в
.env3) Схема меняется только через миграции (Flyway / Liquibase / EF / Alembic)
4) Добавляем init-скрипты + seed данные (опционально)
5) Делаем healthcheck, чтобы сервис не стартовал раньше БД
6) Добавляем backup/restore команды (минимум — дамп)
Итог:
- один репозиторий = одна база
- любые изменения схемы воспроизводимы
- новый разработчик стартует за 3 минуты
1) Создай .env (пример)
cat > .env << 'EOF'
POSTGRES_DB=app
POSTGRES_USER=app
POSTGRES_PASSWORD=app123
POSTGRES_PORT=5432
EOF
# 2) docker-compose.yml для Postgres + healthcheck
cat > docker-compose.yml << 'EOF'
services:
postgres:
image: postgres:16
container_name: app-postgres
restart: unless-stopped
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
ports:
- "${POSTGRES_PORT}:5432"
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 5s
timeout: 3s
retries: 20
volumes:
pgdata:
EOF
3) Запуск
docker compose up -d
4) Проверка
docker compose ps
5) Дамп (на всякий)
docker exec -t app-postgres pg_dump -U app app > backup.sql
6) Восстановление
cat backup.sql | docker exec -i app-postgres psql -U app -d app
❤13🔥6👍2😁1
🍰 Polars v1.37.0: min/max строки по другой колонке - в одну строку
Раньше, чтобы найти строку с минимальным/максимальным значением по другой колонке, приходилось:
- сортировать
- группировать
- писать сложные фильтры
Теперь в Polars v1.37.0 всё проще.
Добавили методы выражений:
✅ min_by
✅ max_by
Они позволяют находить min/max значения по любой колонке одной понятной строкой кода - без лишней магии и многошаговых костылей.
Пример логики:
"дай продукт с максимальными продажами внутри каждой категории" - теперь делается красиво и читаемо.
Обновление:
Раньше, чтобы найти строку с минимальным/максимальным значением по другой колонке, приходилось:
- сортировать
- группировать
- писать сложные фильтры
Теперь в Polars v1.37.0 всё проще.
Добавили методы выражений:
✅ min_by
✅ max_by
Они позволяют находить min/max значения по любой колонке одной понятной строкой кода - без лишней магии и многошаговых костылей.
Пример логики:
"дай продукт с максимальными продажами внутри каждой категории" - теперь делается красиво и читаемо.
Обновление:
pip install -U polars🔥7👍4❤1
🚀 STEP3-VL-10B - мультимодальная модель, которая бьёт гигантов (и весит всего 10B)
StepFun выпустили STEP3-VL-10B - компактную open multimodal модель, которая по метрикам догоняет и местами обгоняет монстров в 10-20 раз больше.
Что заявляют по качеству
- держит SOTA/near-SOTA по визуальному восприятию + reasoning
- на ряде тестов конкурирует с GLM-4.6V, Qwen3-VL и даже Gemini 2.5 Pro
- сильна в OCR, понимании GUI, пространственном мышлении (важно для embodied AI)
Ключевые цифры
- обучена на 1.2T токенов
- 1400+ RL-раундов (RLHF + RLVR)
- поддержка PaCoRe (parallel collaborative reasoning) и контекст до 128K
- в классе <10B лидирует в STEM-задачах:
94.43% на AIME 2025 (с PaCoRe)
Архитектура
- PE-lang visual encoder (1.8B)
- Qwen3-8B decoder
- multi-crop high-res: 728×728 global + локальные кропы
Почему это важно
Тренд очевиден: индустрия уходит от “просто больше параметров”.
Теперь выигрывает тот, кто:
- грамотно собирает архитектуру
- делает сильный RL
- и выжимает максимум из маленькой модели
Base: https://modelscope.cn/models/stepfun-ai/Step3-VL-10B-Base
Chat: https://modelscope.cn/models/stepfun-ai/Step3-VL-10B
StepFun выпустили STEP3-VL-10B - компактную open multimodal модель, которая по метрикам догоняет и местами обгоняет монстров в 10-20 раз больше.
Что заявляют по качеству
- держит SOTA/near-SOTA по визуальному восприятию + reasoning
- на ряде тестов конкурирует с GLM-4.6V, Qwen3-VL и даже Gemini 2.5 Pro
- сильна в OCR, понимании GUI, пространственном мышлении (важно для embodied AI)
Ключевые цифры
- обучена на 1.2T токенов
- 1400+ RL-раундов (RLHF + RLVR)
- поддержка PaCoRe (parallel collaborative reasoning) и контекст до 128K
- в классе <10B лидирует в STEM-задачах:
94.43% на AIME 2025 (с PaCoRe)
Архитектура
- PE-lang visual encoder (1.8B)
- Qwen3-8B decoder
- multi-crop high-res: 728×728 global + локальные кропы
Почему это важно
Тренд очевиден: индустрия уходит от “просто больше параметров”.
Теперь выигрывает тот, кто:
- грамотно собирает архитектуру
- делает сильный RL
- и выжимает максимум из маленькой модели
Base: https://modelscope.cn/models/stepfun-ai/Step3-VL-10B-Base
Chat: https://modelscope.cn/models/stepfun-ai/Step3-VL-10B
👍7❤2🔥1
Какой из вариантов описывает поведение EXCLUDE ограничения в PostgreSQL?
Anonymous Quiz
16%
A) Гарантирует уникальность по одному столбцу
62%
B) Запрещает пересечение диапазонов или других типов данных по заданному правилу
14%
C) Аналог UNIQUE, но только для числовых данных
8%
D) Работает только с индексами типа B-tree
👍6❤1🔥1
⚡️ SQL совет: миграции БД без боли (как в продакшене)
Если ты до сих пор “правишь базу руками”, а потом ловишь рассинхрон между dev/stage/prod - остановись.
Правильная миграция БД должна быть:
✅ воспроизводимой
✅ версионируемой
✅ безопасной при откате
✅ без даунтайма (по возможности)
Ключевые правила миграций:
1) Каждое изменение = отдельная миграция (не правь историю)
2) Только вперёд: rollback делай отдельной миграцией
3) Миграции должны быть idempotent, если это возможно
4) Никаких “ALTER TABLE в обед” на проде
5) Разделяй schema и data миграции
6) Для больших таблиц - делай изменения по шагам (expand -> migrate -> contract)
Самый безопасный паттерн:
- Добавляешь новое поле/таблицу (expand)
- Пишешь код, который работает и со старым, и с новым
- Переносишь данные (migrate)
- Удаляешь старое (contract)
Если ты до сих пор “правишь базу руками”, а потом ловишь рассинхрон между dev/stage/prod - остановись.
Правильная миграция БД должна быть:
✅ воспроизводимой
✅ версионируемой
✅ безопасной при откате
✅ без даунтайма (по возможности)
Ключевые правила миграций:
1) Каждое изменение = отдельная миграция (не правь историю)
2) Только вперёд: rollback делай отдельной миграцией
3) Миграции должны быть idempotent, если это возможно
4) Никаких “ALTER TABLE в обед” на проде
5) Разделяй schema и data миграции
6) Для больших таблиц - делай изменения по шагам (expand -> migrate -> contract)
Самый безопасный паттерн:
- Добавляешь новое поле/таблицу (expand)
- Пишешь код, который работает и со старым, и с новым
- Переносишь данные (migrate)
- Удаляешь старое (contract)
-- 1) таблица миграций (если нет инструмента)
create table if not exists schema_migrations (
version text primary key,
applied_at timestamptz not null default now()
);
-- 2) миграция: добавляем колонку безопасно
alter table users add column if not exists phone text;
-- 3) перенос данных (пример)
update users
set phone = regexp_replace(contact, '[^0-9+]', '', 'g')
where phone is null and contact is not null;
-- 4) фиксируем версию миграции
insert into schema_migrations(version)
values ('2026_01_21_add_users_phone')
on conflict do nothing;
👍6❤3🔥2😭1💊1
У тебя есть таблица логов. Нужно найти пользователей, которые заходили 3 дня подряд.
Таблица:
- user_id
- event_date (DATE)
Задача:
Верни
user_id и дату третьего дня серии (то есть конец 3-дневной цепочки).Ловушка:
1) В один день может быть несколько событий - их нельзя считать как разные дни
2) Дни должны идти подряд по календарю (не “3 записи подряд”)
-- PostgreSQL / MySQL 8+ (через window functions)
WITH uniq_days AS (
SELECT DISTINCT user_id, event_date
FROM user_events
),
grp AS (
SELECT
user_id,
event_date,
event_date
- INTERVAL '1 day' * (ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY event_date))
AS anchor
FROM uniq_days
),
runs AS (
SELECT
user_id,
MIN(event_date) AS start_day,
MAX(event_date) AS end_day,
COUNT(*) AS days_cnt
FROM grp
GROUP BY user_id, anchor
)
SELECT user_id, end_day AS third_day
FROM runs
WHERE days_cnt >= 3
ORDER BY user_id, third_day;
Почему это работает:
-
DISTINCT убирает повторы в один день- “anchor” превращает подряд идущие даты в одну группу
- дальше считаем длину серии и берём конец
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥4❤3🏆1
This media is not supported in your browser
VIEW IN TELEGRAM
LuxTTS - очень быстрый и компактный TTS с клонированием голоса
Модель со ставкой на скорость + реализм, при этом она остается лёгкой и доступной по ресурсам.
Главные фишки:
- ⚡ До 150× realtime при генерации речи
- 🎙️ Хорошая передача эмоций и естественности
- 🧬 Качественное voice cloning
- 💾 Влезает примерно в 1 ГБ VRAM
- 🖥️ Работает и на CPU - 2–6× realtime
Подходит для:
- голосовых ассистентов
- озвучки приложений
- быстрых прототипов без тяжёлой инфраструктуры
- LuxTTS работает как мульти-язычная TTS-модель, и русский входит в список языков.
Repo: https://github.com/ysharma3501/LuxTTS
Модель: https://huggingface.co/YatharthS/LuxTTS
Модель со ставкой на скорость + реализм, при этом она остается лёгкой и доступной по ресурсам.
Главные фишки:
- ⚡ До 150× realtime при генерации речи
- 🎙️ Хорошая передача эмоций и естественности
- 🧬 Качественное voice cloning
- 💾 Влезает примерно в 1 ГБ VRAM
- 🖥️ Работает и на CPU - 2–6× realtime
Подходит для:
- голосовых ассистентов
- озвучки приложений
- быстрых прототипов без тяжёлой инфраструктуры
- LuxTTS работает как мульти-язычная TTS-модель, и русский входит в список языков.
Repo: https://github.com/ysharma3501/LuxTTS
Модель: https://huggingface.co/YatharthS/LuxTTS
❤4👍2🔥1
Forwarded from Machinelearning
Любопытный кейс португальского разработчика Хуго Даниэля, который решил поиграть в жесткую автоматизацию с Сlaude Сode.
Хуго был активным пользователем Сlaude, тратил 220 евро в месяц и однажды решил настроить генерацию шаблонных файлов для новых проектов двумя агентами. Схема была примерно такая:
В какой-то момент Claude A, видимо, устал от тупости коллеги и начал генерировать инструкции капсом, чтобы жестко задать поведение - файл наполнился директивами, которые выглядели как System Prompts.
Гипотеза бана в том, что сработали эвристики защиты от Prompt Injection. Система безопасности Anthropic увидела, что пользователь генерирует и скармливает модели текст, который структурно и лексически выглядит как системные инструкции. Вобщем, для алгоритмов безопасности это выглядит как попытка джейлбрейка.
Ожидаемо, саппорт хранил молчание: ни через систему апелляции (она, кстати на Google Forms), ни письма в поддержку не дали результатов. Через насколько дней пришел только молчаливый возврат средств за подписку. Так что причины блокировки так и остались гипотезой.
Если бы подобный эксперимент проводился у "Корпорации Добра" - сработал бы их вездесущий триггер на "злонамеренную активность", и человек мог бы потерять Gmail, Google Photos, документы и получить кирпич вместо Android-смартфона.
История Хуго - хорошее напоминание о том, что модерация в ИИ сейчас - это черный ящик.
Если вы занимаетесь авто-генерацией промптов, которые выглядят как системные инструкции (то, что называют meta-prompting и scaffolding) - вы ходите по минному полю.
@ai_machinelearning_big_data
#AI #ML #Story #Anthropic
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤4
🧠 Ситуация
У тебя есть старая таблица пользователей:
users_old
---------
id
full_name -- "Ivan Petrov"
email
created_at
Новая схема БД требует нормализации:
users
------
id
first_name
last_name
email
created_at
profiles
--------
user_id
display_name -- оригинальное полное имя
⚠️ Проблема
В full_name данные грязные:
full_name
Ivan Petrov
Maria
John Smith Jr.
Anna-Marie Watson
Dmitry Ivanov
NULL
"" (пустая строка)
Требования миграции:
• Разбить имя на first_name и last_name
• Если фамилии нет → last_name = NULL
• Лишние пробелы убрать
• Суффиксы типа Jr. считать частью фамилии
• Пустые и NULL имена → first_name = 'Unknown'
• Оригинал имени сохранить в profiles.display_name
Миграция должна работать одним SQL-скриптом без Python
🎯 Задача
• Напиши SQL-миграцию, которая:
• Переносит данные из users_old в users
• Создаёт записи в profiles
• Чистит имя
• Работает корректно со всеми кейсами
💣 Усложнение (вот где ловушка)
• Таблица 10 млн строк, нельзя:
• Делать UPDATE по одной строке
• Использовать курсоры
• Только set-based SQL.
💡 Ожидаемое решение (PostgreSQL)
INSERT INTO users (id, first_name, last_name, email, created_at)
SELECT
id,
-- first_name
CASE
WHEN TRIM(full_name) IS NULL OR TRIM(full_name) = '' THEN 'Unknown'
ELSE split_part(TRIM(regexp_replace(full_name, '\s+', ' ', 'g')), ' ', 1)
END,
-- last_name
CASE
WHEN TRIM(full_name) IS NULL OR TRIM(full_name) = '' THEN NULL
WHEN array_length(string_to_array(TRIM(regexp_replace(full_name, '\s+', ' ', 'g')), ' '), 1) = 1
THEN NULL
ELSE substring(
TRIM(regexp_replace(full_name, '\s+', ' ', 'g'))
FROM position(' ' IN TRIM(regexp_replace(full_name, '\s+', ' ', 'g'))) + 1
)
END,
email,
created_at
FROM users_old;
INSERT INTO profiles (user_id, display_name)
SELECT
id,
NULLIF(TRIM(full_name), '')
FROM users_old;
Задача проверяет:
• работу со строками
• regexp_replace
• split_part
• edge cases
• производительность (set-based)
• реальную миграцию, а не учебный select
У тебя есть старая таблица пользователей:
users_old
---------
id
full_name -- "Ivan Petrov"
created_at
Новая схема БД требует нормализации:
users
------
id
first_name
last_name
created_at
profiles
--------
user_id
display_name -- оригинальное полное имя
⚠️ Проблема
В full_name данные грязные:
full_name
Ivan Petrov
Maria
John Smith Jr.
Anna-Marie Watson
Dmitry Ivanov
NULL
"" (пустая строка)
Требования миграции:
• Разбить имя на first_name и last_name
• Если фамилии нет → last_name = NULL
• Лишние пробелы убрать
• Суффиксы типа Jr. считать частью фамилии
• Пустые и NULL имена → first_name = 'Unknown'
• Оригинал имени сохранить в profiles.display_name
Миграция должна работать одним SQL-скриптом без Python
🎯 Задача
• Напиши SQL-миграцию, которая:
• Переносит данные из users_old в users
• Создаёт записи в profiles
• Чистит имя
• Работает корректно со всеми кейсами
💣 Усложнение (вот где ловушка)
• Таблица 10 млн строк, нельзя:
• Делать UPDATE по одной строке
• Использовать курсоры
• Только set-based SQL.
💡 Ожидаемое решение (PostgreSQL)
SELECT
id,
-- first_name
CASE
WHEN TRIM(full_name) IS NULL OR TRIM(full_name) = '' THEN 'Unknown'
ELSE split_part(TRIM(regexp_replace(full_name, '\s+', ' ', 'g')), ' ', 1)
END,
-- last_name
CASE
WHEN TRIM(full_name) IS NULL OR TRIM(full_name) = '' THEN NULL
WHEN array_length(string_to_array(TRIM(regexp_replace(full_name, '\s+', ' ', 'g')), ' '), 1) = 1
THEN NULL
ELSE substring(
TRIM(regexp_replace(full_name, '\s+', ' ', 'g'))
FROM position(' ' IN TRIM(regexp_replace(full_name, '\s+', ' ', 'g'))) + 1
)
END,
email,
created_at
FROM users_old;
INSERT INTO profiles (user_id, display_name)
SELECT
id,
NULLIF(TRIM(full_name), '')
FROM users_old;
Задача проверяет:
• работу со строками
• regexp_replace
• split_part
• edge cases
• производительность (set-based)
• реальную миграцию, а не учебный select
👍6🔥2❤1
This media is not supported in your browser
VIEW IN TELEGRAM
🧠 Важно знать: избегай SELECT * для оптимизации запросов!
Использование
Использование
SELECT * может привести к излишней загрузке данных и снижению производительности. Вместо этого, укажите только необходимые столбцы для выборки. Это не только упростит обработку данных, но и позволит использовать индексы более эффективно.
-- Вместо этого:
SELECT * FROM orders WHERE customer_id = 123;
-- Используйте явный выбор столбцов:
SELECT order_id, order_date, total_amount
FROM orders
WHERE customer_id = 123;
-- Дополнительно можно добавить индексы если это необходимо:
CREATE INDEX idx_customer_id ON orders(customer_id);
👍12😁4❤2🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
🔥 Как убрать дубликаты в SQL с использованием временной таблицы.
Чтобы убрать все дубликаты данных в таблице, важно использовать временную таблицу для сохранения уникальных записей, а затем обновить оригинальную таблицу. Это поможет избежать потенциальных проблем при работе с большим объемом данных и обеспечит целостность.
Чтобы убрать все дубликаты данных в таблице, важно использовать временную таблицу для сохранения уникальных записей, а затем обновить оригинальную таблицу. Это поможет избежать потенциальных проблем при работе с большим объемом данных и обеспечит целостность.
-- Создание временной таблицы с уникальными записями
CREATE TABLE temp_unique AS
SELECT DISTINCT *
FROM your_table;
-- Удаление всех записей из оригинальной таблицы
DELETE FROM your_table;
-- Вставка уникальных данных обратно в оригинальную таблицу
INSERT INTO your_table
SELECT *
FROM temp_unique;
-- Удаление временной таблицы
DROP TABLE temp_unique;
❤9👍3🔥1😁1
This media is not supported in your browser
VIEW IN TELEGRAM
Иногда самая коварная задача - найти “покупали 3 дня подряд”. Профи часто делают self-join на даты, но он ломается на дубликатах, таймзонах и нескольких покупках в день.
Подвох: нужно считать не покупки, а уникальные дни, и правильно собрать последовательности без дыр. Решение выглядит просто, но без оконных функций легко ошибиться.
-- Задача:
-- Найти пользователей, которые совершали покупку 3 календарных дня подряд (минимум).
-- Условия:
-- 1) В один день может быть много покупок - считаем день один раз.
-- 2) Нужны именно подряд идущие дни без пропусков.
-- 3) Вернуть user_id и начало/конец самой длинной серии.
WITH days AS (
SELECT DISTINCT
user_id,
DATE(created_at) AS d
FROM orders
),
grp AS (
SELECT
user_id,
d,
-- трюк: для подряд идущих дат разность (дата - номер) постоянна
DATEADD(day, -ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY d), d) AS g
FROM days
),
streaks AS (
SELECT
user_id,
MIN(d) AS streak_start,
MAX(d) AS streak_end,
COUNT(*) AS streak_len
FROM grp
GROUP BY user_id, g
)
SELECT user_id, streak_start, streak_end, streak_len
FROM streaks
WHERE streak_len >= 3
ORDER BY streak_len DESC;
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9😍2❤1
Google переименовал ZetaSQL в GoogleSQL
Компания Google объявила о переименовании SQL-анализатора ZetaSQL в GoogleSQL. Проект развивает инструментарий для разбора и анализа грамматики, семантики, типов, модели данных и функций для языка SQL и диалекта GoogleSQL. Диалект GoogleSQL примечателен возможностью объединения запросов при помощи неименованных каналов (pipe) и применяется в различных продуктах и сервисах Google, среди которых BigQuery, Spanner, F1, BigTable, Dremel и Procella. Код проекта написан на языке С++ и распространяется под лицензией Apache 2.0.
https://opennet.ru/64735/
Компания Google объявила о переименовании SQL-анализатора ZetaSQL в GoogleSQL. Проект развивает инструментарий для разбора и анализа грамматики, семантики, типов, модели данных и функций для языка SQL и диалекта GoogleSQL. Диалект GoogleSQL примечателен возможностью объединения запросов при помощи неименованных каналов (pipe) и применяется в различных продуктах и сервисах Google, среди которых BigQuery, Spanner, F1, BigTable, Dremel и Procella. Код проекта написан на языке С++ и распространяется под лицензией Apache 2.0.
https://opennet.ru/64735/
👍3❤1🔥1
Ты научишься делать те, которые живут в проде.
Это не про BeautifulSoup ради галочки.
Это про системы сбора данных, которые:
• не падают от мелких правок на сайте
• собирают данные в разы быстрее
• обновляют всё сами по расписанию
• обходят ограничения и баны
• выглядят как сервис, а не хаос из файлов
Ты начнёшь видеть сайты не как страницы, а как источники данных, к которым можно подключиться.
В итоге ты сможешь:
• забирать данные для своих проектов
• автоматизировать чужую рутину
• делать инструменты для аналитики
• брать коммерческие заказы на сбор данных
Это навык, который напрямую превращается в деньги.
Не “знаю Python”, а умею добывать данные из интернета профессионально.
🎁 48 часов скидка 50% на Stepik: https://stepik.org/a/269942/
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1🔥1😁1