NULL++
Всем привет!
Кстати, в канале появилась возможность написать мне лично, если вы не хотите писать под постами на всеобщее обозрение =)
Сообщения сделал бесплатными (надеюсь, что это получилось, надо потетсить), так как сейчас основная задача канала - делиться своими мыслями и опытом =)
Кстати, в канале появилась возможность написать мне лично, если вы не хотите писать под постами на всеобщее обозрение =)
Сообщения сделал бесплатными (надеюсь, что это получилось, надо потетсить), так как сейчас основная задача канала - делиться своими мыслями и опытом =)
🔥2
Шпаргалка SQL.pdf
201 KB
Всем привет!
Решил я тут сделать себе небольшую шпаргалку - ну, знаете, чтобы быстро вспомнить всякие рабочие моменты, когда голова уже не варит. На память особо не жалуюсь, а постоянное гугление одних и тех же вещей бесит.
Начал, конечно, с #SQL. Куда ж без него. Это база, на которой всё держится, но нужно помнить, что это лишь для повторения, то есть вы уже должны это знать =)
Собрал самое основное:
- Фильтрации
- Агрегации
- JOIN'ы
- Подзапросы
- Обновление / вставка / удаление записей
- Оконочки
- Права доступа
В общем, качайте файл и повторяйте! Материал пригодится всем!
Если понравилось, ставь реакцию. А я пока готовлю аналогичную шпаргалку по Python
@nullpp #полезное #обучение
Решил я тут сделать себе небольшую шпаргалку - ну, знаете, чтобы быстро вспомнить всякие рабочие моменты, когда голова уже не варит. На память особо не жалуюсь, а постоянное гугление одних и тех же вещей бесит.
Начал, конечно, с #SQL. Куда ж без него. Это база, на которой всё держится, но нужно помнить, что это лишь для повторения, то есть вы уже должны это знать =)
Собрал самое основное:
- Фильтрации
- Агрегации
- JOIN'ы
- Подзапросы
- Обновление / вставка / удаление записей
- Оконочки
- Права доступа
В общем, качайте файл и повторяйте! Материал пригодится всем!
Если понравилось, ставь реакцию. А я пока готовлю аналогичную шпаргалку по Python
@nullpp #полезное #обучение
❤9🔥8
Всем привет!
Дело в том, что просмотры сильно просели из-за блокировки ТГ. Если посмотреть на посты раньше, то там было и 150-160 просмотров, а вот у последнего поста лишь 38 на данный момент.
И вот у меня есть вопрос к вам, моей аудитории: как можно продвигать свой канал?
Или может стоит дублировать посты куда-нибудь в сообщество ВК (хотя там не хочется, если честно)?
Очень жду комментариев и предложений =)
П.С. шпаргалка по Python Часть 1 уже почти готова))
@nullpp #вопрос
Дело в том, что просмотры сильно просели из-за блокировки ТГ. Если посмотреть на посты раньше, то там было и 150-160 просмотров, а вот у последнего поста лишь 38 на данный момент.
И вот у меня есть вопрос к вам, моей аудитории: как можно продвигать свой канал?
Или может стоит дублировать посты куда-нибудь в сообщество ВК (хотя там не хочется, если честно)?
Очень жду комментариев и предложений =)
П.С. шпаргалка по Python Часть 1 уже почти готова))
@nullpp #вопрос
🤔4🤷♀1
Шпаргалка Python. Часть 1. Основы.pdf
327.9 KB
Всем привет!
Как я и обещал, выкладываю ещё одну шпаргалку, но теперь уже для #Python.
Что в неё вошло:
- Типы данных
- Циклы
- Условия
- Функции
- Классы
- Работа со строками
- Работа с файлами
- Обработка исключений
Вспоминаем, повторяем!
А я планирую сделать ещё шпаргалку по Python, но уже для обработки данных DS и немного ML захвачу
@nullpp #полезное #обучение
Как я и обещал, выкладываю ещё одну шпаргалку, но теперь уже для #Python.
Что в неё вошло:
- Типы данных
- Циклы
- Условия
- Функции
- Классы
- Работа со строками
- Работа с файлами
- Обработка исключений
Вспоминаем, повторяем!
А я планирую сделать ещё шпаргалку по Python, но уже для обработки данных DS и немного ML захвачу
@nullpp #полезное #обучение
🔥11❤5👍1
Всем привет!
В чатике, где я обучаюсь, @axdtor выкатил полезную штуку, которой я хочу поделиться.
Спасибо ему за такую полезную информацию =)
Как поставить Python-библиотеки без интернета
Вариант 1 - скачать все зависимости из requirements.txt на компьютере с интернетом:
В итоге появятся:
Их нужно скопировать на рабочий компьютер без интернета. На рабочем компьютере:
Что значат параметры:
Вариант 2 - скачать конкретные библиотеки на компьютере с интернетом:
Потом перенести папку
На рабочем компьютере:
Для работы с GeoPandas можно заранее скачать такой набор:
@nullpp #полезное #python #библиотеки
В чатике, где я обучаюсь, @axdtor выкатил полезную штуку, которой я хочу поделиться.
Спасибо ему за такую полезную информацию =)
Как поставить Python-библиотеки без интернета
Вариант 1 - скачать все зависимости из requirements.txt на компьютере с интернетом:
pip freeze > requirements.txt
mkdir OffLine_libs
pip download -r requirements.txt -d OffLine_libs
В итоге появятся:
requirements.txt
OffLine_libs/
Их нужно скопировать на рабочий компьютер без интернета. На рабочем компьютере:
python -m venv .venv
.venv\Scripts\activate
pip install --no-index --find-links=OffLine_libs -r requirements.txt
Что значат параметры:
--no-index не ходить в интернет
--find-links=OffLine_libs искать пакеты в локальной папке
Вариант 2 - скачать конкретные библиотеки на компьютере с интернетом:
mkdir OffLine_libs
pip download pandas geopandas matplotlib shapely pyogrio pyproj -d OffLine_libs
Потом перенести папку
OffLine_libs на рабочий компьютер.На рабочем компьютере:
python -m venv .venv
.venv\Scripts\activate
pip install --no-index --find-links=OffLine_libs pandas geopandas matplotlib
shapely pyogrio pyproj
Для работы с GeoPandas можно заранее скачать такой набор:
pip download geopandas matplotlib pyogrio shapely pyproj fiona -d OffLine_libs
@nullpp #полезное #python #библиотеки
🔥3
Всем привет!
Бывало у вас, что запрос выполняется очень долго? Что же с ним можно сделать? Конечно, попытаться оптимизировать!
Один из главных способов оптимизации - это изучить план запроса и посмотреть, что в запросе работает медленно.
Типичный процесс оптимизации выглядит как-то так:
Создал карточки с более подробной информацией.
Изучай, сохраняй себе!
@nullpp #SQL #оптимизация #PostgreSQL
Бывало у вас, что запрос выполняется очень долго? Что же с ним можно сделать? Конечно, попытаться оптимизировать!
Один из главных способов оптимизации - это изучить план запроса и посмотреть, что в запросе работает медленно.
Типичный процесс оптимизации выглядит как-то так:
-- 1. Медленный запрос
EXPLAIN ANALYZE SELECT ...; -- смотрим: видим Seq Scan и large actual time
-- 2. Создаём индекс
CREATE INDEX idx_xxx ON table(column);
-- 3. Обновляем статистику
ANALYZE table;
-- 4. Проверяем
EXPLAIN ANALYZE SELECT ...; -- должно стать Index Scan + время упало
Создал карточки с более подробной информацией.
Изучай, сохраняй себе!
@nullpp #SQL #оптимизация #PostgreSQL
🔥3🤷1
Шпаргалка Python. Часть 2. DS-ML.pdf
295.6 KB
Всем привет!
А вот и подоспела шпаргалка #Python для DS/ML.
Что в неё вошло:
- Немного NumPy
- Работа с датафреймами в Pandas
- Предобработка данных
- Метрики качества
- Кратко об основных ML-моделях
- Совсем немного про пайплайны
Вспоминаем, повторяем!
А если понравилось, то ставь реакцию =) А то их совсем мало стало xD
А вот и подоспела шпаргалка #Python для DS/ML.
Что в неё вошло:
- Немного NumPy
- Работа с датафреймами в Pandas
- Предобработка данных
- Метрики качества
- Кратко об основных ML-моделях
- Совсем немного про пайплайны
Вспоминаем, повторяем!
А если понравилось, то ставь реакцию =) А то их совсем мало стало xD
🔥9
Всем ещё раз привет!
Хотел создать группу в ВК, но адрес vk.com/nullpp какой-то нехороший человек занял... интересно даже кто)))
Поэтому создал только канал в сообщениях ВК.
https://vk.com/im/channels/-238438764
Заходим, подписываемся, распространяем всем подряд XD
Хотел создать группу в ВК, но адрес vk.com/nullpp какой-то нехороший человек занял... интересно даже кто)))
Поэтому создал только канал в сообщениях ВК.
https://vk.com/im/channels/-238438764
Заходим, подписываемся, распространяем всем подряд XD
👏2
Всем привет!
Наконец-то образовательный контент подъехал!
Хочу устроить решение задач по SQL в прямом эфире. Нашёл много тестовых задач с собеседований. Правда большинство из них спрятаны под Премиум-подпиской портала. Но всё же можно что-то да порешать.
Когда? Думаю либо завтра (08.05) примерно в 19:00, либо в воскресенье (10.05) тоже примерно в 19:00.
Ставь под постом
🔥, если тебе удобнее 08.05 и
⚡️, если удобнее в 10.05.
Наконец-то образовательный контент подъехал!
Хочу устроить решение задач по SQL в прямом эфире. Нашёл много тестовых задач с собеседований. Правда большинство из них спрятаны под Премиум-подпиской портала. Но всё же можно что-то да порешать.
Когда? Думаю либо завтра (08.05) примерно в 19:00, либо в воскресенье (10.05) тоже примерно в 19:00.
Ставь под постом
🔥, если тебе удобнее 08.05 и
⚡️, если удобнее в 10.05.
⚡11🔥2
NULL++
Где?
Всем привет!
Судя по результатам голосования, сегодня в 19:00 встречаемся на ютубе. Ссылку скину ближе к этому времени =)
Пытался создать там отдельный канал NULL++, чтобы там и вести будущие трансляции, но для этого требуется подтверждение номера телефона. Испробовал все свои номера, но так и не получилось это сделать. Скорее всего дело опять в том, что номер Российский.
Но не стоит переживать! У меня уже есть один подтверждённый аккаунт, поэтому буду делать стрим через него.
@nullpp #стрим #sql #тестовыезадания
Судя по результатам голосования, сегодня в 19:00 встречаемся на ютубе. Ссылку скину ближе к этому времени =)
Пытался создать там отдельный канал NULL++, чтобы там и вести будущие трансляции, но для этого требуется подтверждение номера телефона. Испробовал все свои номера, но так и не получилось это сделать. Скорее всего дело опять в том, что номер Российский.
Но не стоит переживать! У меня уже есть один подтверждённый аккаунт, поэтому буду делать стрим через него.
@nullpp #стрим #sql #тестовыезадания
👍4
Ура! Уже начинаем! Ждём только тебя!
https://youtube.com/live/6WI_rsiD8Jw
https://youtube.com/live/6WI_rsiD8Jw
YouTube
Решаем тестовые задачи на SQL #1
00:00 Заставка
06:10 Начало стрима
08:44 VK. Доход с женской аудитории
14:16 Сбербанк. Зарплата выше руководителя
23:45 Альфа-Банк. Средний возрас покупателей Smartwatch
42:28 Самокат. Работающие склады по городам
51:55 Домклик. Население каждого региона…
06:10 Начало стрима
08:44 VK. Доход с женской аудитории
14:16 Сбербанк. Зарплата выше руководителя
23:45 Альфа-Банк. Средний возрас покупателей Smartwatch
42:28 Самокат. Работающие склады по городам
51:55 Домклик. Население каждого региона…
🔥3
Ну как? Понравился стрим?
Успели решить 7 задачек разной сложности. К сожалению, все задачи максимальной сложности закрыты без подписки. Но и открытых задач ещё хватит на пару стримов =)
Запись прошедшего стрима лежит тут
https://www.youtube.com/watch?v=6WI_rsiD8Jw&t=366
Успели решить 7 задачек разной сложности. К сожалению, все задачи максимальной сложности закрыты без подписки. Но и открытых задач ещё хватит на пару стримов =)
Запись прошедшего стрима лежит тут
https://www.youtube.com/watch?v=6WI_rsiD8Jw&t=366
YouTube
Решаем тестовые задачи на SQL #1
00:00 Заставка
06:10 Начало стрима
08:44 VK. Доход с женской аудитории
14:16 Сбербанк. Зарплата выше руководителя
23:45 Альфа-Банк. Средний возрас покупателей Smartwatch
42:28 Самокат. Работающие склады по городам
51:55 Домклик. Население каждого региона…
06:10 Начало стрима
08:44 VK. Доход с женской аудитории
14:16 Сбербанк. Зарплата выше руководителя
23:45 Альфа-Банк. Средний возрас покупателей Smartwatch
42:28 Самокат. Работающие склады по городам
51:55 Домклик. Население каждого региона…
🔥3
Привет аналитики!
Уже неделя прошла после стрима - и ни одного поста за это время!
Немного был занят, чуть позже расскажу, это будет интересно =)
А пока, хочу рассказать о прикольной штуке в SQL.
Есть такая фишка как FILTER - удобная альтернатива CASE WHEN в некоторых случаях. Используется в агрегатных функциях.
Например, вместо
можно написать
Согласитесь, такой синтаксис легче читается?
Поддерживают: PostgreSQL, SQLite (3.30+), DuckDB, ClickHouse
Нет в: MySQL, SQL Server, Oracle (там только CASE)
Вот ещё пример:
или
!!! В ClickHouse FILTER (WHERE ...) тоже работает, но есть нюанс.
Но вообще, в ClickHouse много всяких дополнительных функций, которые уже решают ряд задач. Например:
Ну как, полезно? Забирай в заметки и жми 🔥
Уже неделя прошла после стрима - и ни одного поста за это время!
Немного был занят, чуть позже расскажу, это будет интересно =)
А пока, хочу рассказать о прикольной штуке в SQL.
Есть такая фишка как FILTER - удобная альтернатива CASE WHEN в некоторых случаях. Используется в агрегатных функциях.
Например, вместо
SUM(CASE WHEN condition THEN 1 END)
можно написать
COUNT(*) FILTER (WHERE condition)
Согласитесь, такой синтаксис легче читается?
Поддерживают: PostgreSQL, SQLite (3.30+), DuckDB, ClickHouse
Нет в: MySQL, SQL Server, Oracle (там только CASE)
Вот ещё пример:
-- Продажи по статусу
SELECT
category,
COUNT(*) FILTER (WHERE status = 'completed') AS completed,
COUNT(*) FILTER (WHERE status = 'cancelled') AS cancelled
FROM orders
GROUP BY category;
или
-- Средний чек только по успешным
SELECT
AVG(amount) FILTER (WHERE paid_at IS NOT NULL) AS avg_paid
FROM transactions;
!!! В ClickHouse FILTER (WHERE ...) тоже работает, но есть нюанс.
-- count(*) с FILTER не работает
SELECT count(*) FILTER (WHERE uid > 2000) FROM users;
-- используйте count(1)
SELECT count(1) FILTER (WHERE uid > 2000) FROM users;
Но вообще, в ClickHouse много всяких дополнительных функций, которые уже решают ряд задач. Например:
-- Вместо FILTER
SELECT avg(number) FILTER (WHERE number > 50) FROM numbers(100);
-- Пишем короче и надёжнее
SELECT avgIf(number, number > 50) FROM numbers(100);
-- Количество успешных заказов
SELECT countIf(1, status = 'completed') FROM orders;
-- Сумма только крупных платежей
SELECT sumIf(amount, amount > 1000) FROM payments;
-- Уникальные пользователи из США
SELECT uniqIf(user_id, country = 'US') FROM events;
Ну как, полезно? Забирай в заметки и жми 🔥
🔥8
Привет, аналитики!
Сегодня я расскажу, куда я пропал почти на две недели.
Но для начала хочу поздравить себя с Днём рождения! Да-да, именно сегодня оно и есть.
А ещё я стал на год опытнее и на несколько седых волос ближе к дата-сайенсу.
А теперь к главной теме поста.
Мне предложили проверять работы (в том числе и финальные проекты) на курсе «Аналитика данных» в Симулейтив - онлайн-школе, в которой я сам обучался аналитике, благодаря которой я решился пройти этот нелёгкий путь и сменить профессию. Если вы уже являетесь студентом и подошли к финалу своего обучения, то очень вероятно, что именно я буду проверять вашу работу. Уже успешно проверил несколько работ. Я пока не ментор, но, так сказать, эксперт-преподаватель. Есть к чему стремиться.
А ещё я проходил всякие собесы и выполнял тестовые задания. Не скажу, что их было прям очень много, но мне хватило. Даже попробовал пробиться в бигтех, ахахаха.
В основном после собеса с HR я слышал отказы по причине: "Мы ищем аналитика с опытом от трёх лет", хотя весь мой опыт был указан в резюме изначально.
К моему сожалению, конверсия на hh стала ещё меньше, чем год назад, но, несмотря на это, "касаний" с HR было больше.
Но вполне возможно, что это связано с тем, что я откликался только на мидловые вакансии.
Что из этого получилось, я расскажу через неделю =)
#работа #hr @nullpp
Сегодня я расскажу, куда я пропал почти на две недели.
Но для начала хочу поздравить себя с Днём рождения! Да-да, именно сегодня оно и есть.
А ещё я стал на год опытнее и на несколько седых волос ближе к дата-сайенсу.
А теперь к главной теме поста.
Мне предложили проверять работы (в том числе и финальные проекты) на курсе «Аналитика данных» в Симулейтив - онлайн-школе, в которой я сам обучался аналитике, благодаря которой я решился пройти этот нелёгкий путь и сменить профессию. Если вы уже являетесь студентом и подошли к финалу своего обучения, то очень вероятно, что именно я буду проверять вашу работу. Уже успешно проверил несколько работ. Я пока не ментор, но, так сказать, эксперт-преподаватель. Есть к чему стремиться.
А ещё я проходил всякие собесы и выполнял тестовые задания. Не скажу, что их было прям очень много, но мне хватило. Даже попробовал пробиться в бигтех, ахахаха.
В основном после собеса с HR я слышал отказы по причине: "Мы ищем аналитика с опытом от трёх лет", хотя весь мой опыт был указан в резюме изначально.
К моему сожалению, конверсия на hh стала ещё меньше, чем год назад, но, несмотря на это, "касаний" с HR было больше.
Но вполне возможно, что это связано с тем, что я откликался только на мидловые вакансии.
Что из этого получилось, я расскажу через неделю =)
#работа #hr @nullpp
🎉10🔥4
Привет, аналитики!
Ну что ж, пришло время рассказать, что я сегодня работал последний день в Денвик-аналитика, и с завтрашнего для приступаю к работе в другой компании (пока секрет в какой). Сейчас не об этом.
За последний месяц я прошёл несколько собесов с HR, пару собесов с директорами и получил один офер. Если подумать, то от первых кликов на hh до офера прошло около 1,5 месяцев.
У меня в конце мая планировался небольшой отпуск ко дню рождения, но из-за увольнения, я пошёл навстречу бывшему начальству и отозвал его, чтобы "остаться в хороших отношениях" и закончить текущие проекты. На текущий момент, я понял, что сделал это зря =) В спешном порядке пахал как не в себя, чтобы "не подвести".
И... Никакого профита я с этого не поимел, не смотря на то, что закончил все три проекта, которые были у меня в работе в срок и, некоторые, даже раньше на несколько недель.
Премию за них мне не начислили, и не начислят. То есть двойной (или даже тройной) профит поимела только компания. Ну что ж? Урок мне на будущее - сразу обговаривать окончательные условия при увольнении =) Спасибо, так сказать, за опыт.
Мишезаменителя нашли очень быстро. Ну а почему бы и нет? Количество откликов на вакансии джуна исчисляются сотнями и доходят до тысячи и выше.
Насколько мне стало известно, он уже в этот четверг выходит на работу. Ну что ж, удачи ему на этом пути😁
А мне ни пуха, ни пера на новом месте, про которое я расскажу в следующем посте!
@nullpp #работа #hr #увольнение
Ну что ж, пришло время рассказать, что я сегодня работал последний день в Денвик-аналитика, и с завтрашнего для приступаю к работе в другой компании (пока секрет в какой). Сейчас не об этом.
За последний месяц я прошёл несколько собесов с HR, пару собесов с директорами и получил один офер. Если подумать, то от первых кликов на hh до офера прошло около 1,5 месяцев.
У меня в конце мая планировался небольшой отпуск ко дню рождения, но из-за увольнения, я пошёл навстречу бывшему начальству и отозвал его, чтобы "остаться в хороших отношениях" и закончить текущие проекты. На текущий момент, я понял, что сделал это зря =) В спешном порядке пахал как не в себя, чтобы "не подвести".
И... Никакого профита я с этого не поимел, не смотря на то, что закончил все три проекта, которые были у меня в работе в срок и, некоторые, даже раньше на несколько недель.
Премию за них мне не начислили, и не начислят. То есть двойной (или даже тройной) профит поимела только компания. Ну что ж? Урок мне на будущее - сразу обговаривать окончательные условия при увольнении =) Спасибо, так сказать, за опыт.
Мишезаменителя нашли очень быстро. Ну а почему бы и нет? Количество откликов на вакансии джуна исчисляются сотнями и доходят до тысячи и выше.
Насколько мне стало известно, он уже в этот четверг выходит на работу. Ну что ж, удачи ему на этом пути😁
А мне ни пуха, ни пера на новом месте, про которое я расскажу в следующем посте!
@nullpp #работа #hr #увольнение
🔥11❤1👏1
Привет, аналитики!
Первая рабочая неделя на новой работе позади. Ура!
Итак...
Я устроился в компанию Excite Kit (https://uxrocket.ru/about).
Сейчас (на испытательный период) я занимаюсь отчётностью для одного крупного клиента. У них большой переезд из Oracle в ClickHouse (этим занимаюсь не я) и из OracleBI в DataLens (а вот этим как раз занимаюсь я).
Более 50 различных отчётов нужно превратить в удобоваримый дашборд (а может и не один).
Часть отчётов нужно перенести как есть, а другую часть они будут менять и сейчас формируют для этого ТЗ.
Некоторые таблицы там 150+ млн строк. А отчёты содержат джоины по 5-6 таблиц сразу... Вот и надо как-то это ещё и оптимизировать, потому что у DataLens тоже есть свои ограничения как по количеству строк, так и по выделяемой для этого памяти.
@nullpp #работа
Первая рабочая неделя на новой работе позади. Ура!
Итак...
Я устроился в компанию Excite Kit (https://uxrocket.ru/about).
Сейчас (на испытательный период) я занимаюсь отчётностью для одного крупного клиента. У них большой переезд из Oracle в ClickHouse (этим занимаюсь не я) и из OracleBI в DataLens (а вот этим как раз занимаюсь я).
Более 50 различных отчётов нужно превратить в удобоваримый дашборд (а может и не один).
Часть отчётов нужно перенести как есть, а другую часть они будут менять и сейчас формируют для этого ТЗ.
Некоторые таблицы там 150+ млн строк. А отчёты содержат джоины по 5-6 таблиц сразу... Вот и надо как-то это ещё и оптимизировать, потому что у DataLens тоже есть свои ограничения как по количеству строк, так и по выделяемой для этого памяти.
@nullpp #работа
🔥11👍3
Привет, аналитики!
Сегодня без лирики, сразу к делу. Хочу рассказать про одну годную штуку в ClickHouse.
Все мы без сомнений любим
Но при таком соединении соответствия ищутся и ищутся, пока поиск не дойдёт до конца правой таблицы.
А что делать, если я точно уверен, что правая таблица - это справочник, где только уникальные строки? Или мне не нужны все совпадения, а нужно только одно совпадение? В таких случаях можно использовать
Разница колоссальная:
Или вот ещё пример:
В этом примере для каждой строки из таблицы movies выбирается первая найденная совпадающая строка из таблицы genres.
Где полезно?
- Быстрые джойны на миллионах строк
- Когда тебе всё равно, какое значение подтянется (первые попавшиеся метаданные, например)
То есть,
А ещё есть:
-
-
-
О них я напишу в следующих постах
Ну как, полезно? Забирай в заметки и жми 🔥
Сегодня без лирики, сразу к делу. Хочу рассказать про одну годную штуку в ClickHouse.
Все мы без сомнений любим
LEFT JOIN, но всегда есть нюанс: если справа несколько строк — получишь дублирование строк из левой таблицы + соответствующие значения из правой. Классика, всё работает так, как и должно.Но при таком соединении соответствия ищутся и ищутся, пока поиск не дойдёт до конца правой таблицы.
А что делать, если я точно уверен, что правая таблица - это справочник, где только уникальные строки? Или мне не нужны все совпадения, а нужно только одно совпадение? В таких случаях можно использовать
LEFT ANY JOIN.-- Обычный LEFT JOIN (найдёт все совпадения)
SELECT t1.id, t2.value
FROM left_table AS t1
LEFT JOIN right_table AS t2 ON t1.id = t2.id;
-- ANY LEFT JOIN (возьмёт ПЕРВОЕ попавшееся значение)
SELECT t1.id, t2.value
FROM left_table AS t1
LEFT ANY JOIN right_table AS t2 ON t1.id = t2.id;
Разница колоссальная:
LEFT JOIN → 3 строки, если справа 3 записи с одним id.LEFT ANY JOIN → 1 строка на каждый ключ. Берётся первое значение (не детерминировано, нужно быть очень аккуратным, зависит от порядка чтения данных: сортировка на диске, партиции, ORDER BY в запросе, движок таблицы).Или вот ещё пример:
SELECT m.name, g.genre
FROM movies AS m
LEFT ANY JOIN genres AS g
ON m.id = g.movie_id;
В этом примере для каждой строки из таблицы movies выбирается первая найденная совпадающая строка из таблицы genres.
Где полезно?
- Быстрые джойны на миллионах строк
- Когда тебе всё равно, какое значение подтянется (первые попавшиеся метаданные, например)
То есть,
LEFT ANY JOIN может быть полезен в сценариях, где точное совпадение не критично, а цель - быстро получить данные без обработки нескольких совпадений.А ещё есть:
-
LEFT SEMI JOIN-
LEFT ANTI JOIN-
LEFT ASOF JOIN О них я напишу в следующих постах
Ну как, полезно? Забирай в заметки и жми 🔥
🔥7
NULL++
Привет, аналитики! Сегодня без лирики, сразу к делу. Хочу рассказать про одну годную штуку в ClickHouse. Все мы без сомнений любим LEFT JOIN, но всегда есть нюанс: если справа несколько строк — получишь дублирование строк из левой таблицы + соответствующие…
Привет, аналитики!
Продолжаем разговор про ClickHouse-джойны. В прошлый раз затронул
Важно учитывать, что поведение
Вот ещё примеры:
Применять или не применять - дело каждого)
И не забываем, что нельзя однозначно сказать, какая из операций будет дешевле -
Но обычно
В любом случае, забирай в заметки и ставь 🔥, если полезно.
Продолжаем разговор про ClickHouse-джойны. В прошлый раз затронул
LEFT ANY JOIN, сегодня на очереди LEFT SEMI JOIN.LEFT SEMI JOIN возвращает только строки из левой таблицы, для которых есть хотя бы одно совпадение в правой. При этом возвращается только первое найденное совпадение, декартово произведение не формируется и колонки из правой таблицы не добавляются.-- INNER JOIN (может размножить строки, если справа несколько совпадений)
SELECT users.*, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;
-- LEFT SEMI JOIN (каждый пользователь - максимум один раз, без колонок из orders)
SELECT users.*
FROM users
LEFT SEMI JOIN orders ON users.id = orders.user_id;
Важно учитывать, что поведение
LEFT SEMI JOIN может зависеть от конкретной СУБД и алгоритма, который использует оптимизатор запросов. В некоторых случаях вместо него могут применяться другие типы соединений или методы оптимизации.Вот ещё примеры:
-- Найти пользователей, у которых был хотя бы один заказ
SELECT id, name, email
FROM users
LEFT SEMI JOIN orders ON users.id = orders.user_id;
-- Найти курсы, на которые есть хотя бы одна успешная проверка
SELECT course_id, course_name
FROM courses
LEFT SEMI JOIN reviews ON courses.id = reviews.course_id
WHERE reviews.status = 'approved';
-- Клиенты с платежами больше 1000₽
SELECT client_id, name
FROM clients
LEFT SEMI JOIN payments ON clients.id = payments.client_id
WHERE payments.amount > 1000;
Применять или не применять - дело каждого)
И не забываем, что нельзя однозначно сказать, какая из операций будет дешевле -
LEFT SEMI JOIN или обычный LEFT JOIN. Это зависит от конкретных условий запроса, характеристик данных и настроек СУБД. Для оценки стоимости, как уже писал ранее, используй инструменты анализа планов запросов (например, EXPLAIN), которые помогут оценить ресурсы, необходимые для выполнения операции.Но обычно
SEMI JOIN более эффективен, так как хеш-сет может быть меньше полной хеш-таблицы, а для каждой строки левой таблицы больше не выполняется дополнительное сопоставление.В любом случае, забирай в заметки и ставь 🔥, если полезно.
🔥6🤔1