it пингвин | data engineer – Telegram
it пингвин | data engineer
1.71K subscribers
48 photos
5 videos
1 file
60 links
Канал главного разработчика Data Lake крупного банка.
База знаний для джунов, разбор собесов, задачи (jun/mid/sen) с решениями, полезные материалы, обзоры технологий и архитектур.

По вопросам и менторству писать @it_pengwin
Download Telegram
Популярный вопрос с собеседований
data engineer/data analyst
(lvl jun/mid)

Что такое хранилище данных? Чем хранилище отличается от обычной Базы данных? Что такое озеро данных?


*здесь база данных понимается не в общем смысле, а как БД под капотом у классического ПО и транзакционных приложений*

1. База данных (Database, DB) - это система для хранения и управления операционными данными, предназначенная для частых транзакций (добавление, изменение, удаление).

Назначение: Операционная обработка данных (OLTP).

Основные характеристики:
✔️ Оптимизирована для частых транзакций (добавление, изменение, удаление)
✔️ Текущие данные (актуальное состояние системы)
✔️ Нормализованная структура (минимум дублирования)

Примеры:
PostgreSQL
MySQL
Oracle

Когда использовать?
➜ Когда нужна работа с актуальными данными в реальном времени (например, онлайн-платежи, заказы в интернет-магазине).

2. Хранилище данных (Data Warehouse, DWH) - это централизованное хранилище структурированных данных, оптимизированное для аналитики и отчетности. Оно собирает информацию из разных источников, очищает и преобразует её для удобного анализа.

Назначение: Аналитика и отчёты (OLAP).

Основные характеристики:
✔️ Структурированные данные (таблицы, схемы)
✔️ Оптимизировано для сложных аналитических запросов
✔️ Исторические данные (хранятся годами)
✔️ ETL-процессы (очистка и преобразование перед загрузкой)
✔️ Денормализованные схемы ("звезда", "снежинка")

Примеры:
Snowflake
Greenplum
Oracle Exadata

Когда использовать?
➜ Когда нужна аналитика на структурированных данных (например, отчёты по продажам за 5 лет, BI-дашборды).

3. Озеро данных (Data Lake) - это хранилище сырых данных любого формата (структурированных, полуструктурированных, неструктурированных), без строгой схемы.

Назначение: Хранение сырых данных любого формата.

Основные характеристики:
✔️ Любые данные (структурированные, JSON, логи, видео, изображения)
✔️ Масштабируемость (Big Data: Hadoop, S3)
✔️ Используется для ML, AI и глубокого анализа, архивации больших данных на дешевом железе

Примеры:
AWS S3 + Athena
Hadoop HDFS
Yandex Object Storage

Когда использовать?
➜ Когда нужно хранить разнородные данные для последующей обработки (например, логи сервера, данные IoT-устройств, архивы).

Еще раз 😁

🔹 Ключевые отличия 🔹

📌 База данных (DB)
▪️ Тип данных: Структурированные
▪️ Оптимизация: OLTP (транзакции)
▪️ Пример: Банковские транзакции

📌 Хранилище (DWH)
▪️ Тип данных: Структурированные
▪️ Оптимизация: OLAP (аналитика)
▪️ Пример: Анализ продаж за 5 лет

📌 Озеро данных (Data Lake)
▪️ Тип данных: Любые (структур./неструктур.)
▪️ Оптимизация: Хранение + гибкий анализ
▪️ Пример: Хранение логов сервера

Современные системы часто комбинируют подходы, например:

Data Lakehouse (озеро + хранилище) – как в Delta Lake или Databricks.
Гибридные DWH (поддержка полуструктурированных данных, как в Snowflake).

#Вопросы_с_собесов #архитектура
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥42
Всем привет!🫡

Читал книгу Том Кайт "Oracle для профессионалов" (классика) и там был интересный момент про стандарты SQL:
Ни один поставщик не подтверждает сертификатом "совместимость" своих баз
данных со стандартом SQL99 на основном или расширенном уровне. Более того,
я не знаю ни одного поставщика, который заявлял бы, что его продукт полностью
совместим со стандартом на любом из упомянутых уровней.


Странно, вроде бы стандарты, а даже большие гиганты СУБД не полностью их поддерживают. Решил чуть разобраться в стандартизации и сделал для вас ( и для себя) небольшую выжимку. Если такое интересно, жду реакции😎
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2🤔1
Стандартизация SQL

SQL — один из самых старых языков программирования, но мало кто знает, как он менялся за 40 лет. Сегодня разберём стандартизацию SQL.

История SQL берёт начало в 1974 году, когда в лабораториях IBM в рамках проекта System R началась разработка экспериментальной реляционной СУБД. Изначально язык носил название SEQUEL (Structured English Query Language), но потом слово «English» пропало из этого словосочетания, а аббревиатура приобрела тот вид, к которому мы давно уже привыкли.

Бурное развитие коммерческих реализаций SQL и появление множества диалектов могло привести к серьёзным проблемам совместимости. Однако процесс стандартизации начался своевременно - уже в 1982 году ANSI (Американский национальный институт стандартов) поручил своему комитету по базам данных разработать единую спецификацию реляционного языка запросов, что позволило сохранить целостность экосистемы.

Основные стандарты SQL

SQL-86. Первый вариант стандарта, принятый институтом ANSI и одобренный ISO в 1987 году. Базовые операции: SELECT, INSERT, UPDATE, DELETE, CREATE TABLE.
SQL-89. Незначительные доработки предыдущего стандарта.
SQL-92. Существенные изменения. Уровень Entry Level. JOIN-синтаксис (INNER /LEFT /RIGHT JOIN), ALTER TABLE, ограничения (CHECK, FOREIGN KEY), подзапросы. Стандартизировал поведение NULL и агрегатные функции. Золотой стандарт до сих пор.
SQL:1999. Добавлены: регулярные выражения, рекурсивные запросы, триггеры, процедурные расширения, нескалярные типы данных, ООП-возможности.
SQL:2003. Расширения для XML, оконные функции (OLAP), MERGE (UPSERT-операция), генераторы последовательностей.
SQL:2006. Улучшена работа с XML, интеграция SQL и XQuery в запросах.
SQL:2008. Устранены неоднозначности SQL:2003. TRUNCATE TABLE, улучшенные оконные функции (OVER, PARTITION BY). Пагинация через FETCH FIRST n ROWS ONLY (аналог LIMIT).
SQL:2011. Поддержка временных данных (PERIOD FOR), уточнение ACID-транзакций для распределенных систем.
SQL:2016. Защита на уровне строк, JSON-функции (JSON_ARRAY, JSON_OBJECT), ROW PATTERN MATCHING (поиск шаблонов в данных), полиморфные табличные функции.
SQL:2023. Операции над графами, ANY_VALUE(), поддержка шестнадцатеричных/двоичных литералов, GREATEST/LEAST - функции для выбора max/min из списка значений, улучшенный MERGE - контроль над конфликтами при вставке, улучшения JSON - новые операторы для работы с JSON.

Куда движется SQL?
Современные стандарты SQL развиваются в сторону гибридных моделей данных (JSON, графы, векторы для AI) и глубокой аналитики – в будущем появятся встроенные ML-функции и улучшенная обработка временных рядов. Упор делается на безопасность (динамическое маскирование, аудит) и производительность (оптимизация JOIN, распределённые транзакции).
Постепенно стираются границы между SQL и NoSQL: новые версии стандарта добавляют поддержку полуструктурированных данных. Главный тренд – универсальность: один язык для OLTP, OLAP и даже машинного обучения.

Ни одна СУБД не поддерживает стандарты SQL полностью — все они используют собственные расширения и модификации.

Зачем тогда нужны стандарты?
Стандарты SQL служат универсальным ориентиром, задающим общую логику языка и основные принципы работы с данными. Хотя ни одна СУБД не реализует стандарт полностью, именно благодаря ему разные системы сохраняют базовую совместимость - например, все понимают запросы SELECT, WHERE или JOIN. Это позволяет разработчикам легче осваивать новые СУБД и переносить знания между проектами.

Кроме того, стандарт выступает "дорожной картой" развития - новые функции (вроде работы с JSON или оконных функций) сначала появляются в спецификации, а затем постепенно внедряются производителями СУБД. Без единого стандарта различия между диалектами были бы гораздо более радикальными, что затруднило бы работу с базами данных.

#sql
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥3🥴1🤓1
🔹Задача на схлопывание строк🔹

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

Для упрощения будем считать так:

📌Есть таблица, в которой три колонки - номер телефона, дата начала действия строки, дата окончания.
Если дата окончания текущей строки одного номера телефона = дате начала действия следующей строки этого же номера телефон, то мы должны схлопнуть эти строки в одну.

Пример:

88001153535  01.11.2024 13:23  01.11.2024 13:24
88001153535 01.11.2024 13:24 01.11.2024 13:25

Должны схлопнуть в одну строку:
88001153535  01.11.2024 13:23  01.11.2024 13:25



А строки
88001264545  01.11.2024 11:15  01.11.2024 11:24
88001264545 01.11.2024 12:00 01.11.2024 12:01
88001264545 01.11.2024 12:01 01.11.2024 12:08
88001264545 01.11.2024 12:15 01.11.2024 12:26
88001264545 01.11.2024 12:26 01.11.2024 12:35
88001264545 01.11.2024 12:35 01.11.2024 12:45
88001264545 01.11.2024 12:45 01.11.2024 13:14
88001264545 01.11.2024 13:14 01.11.2024 13:21
88001264545 01.11.2024 13:21 01.11.2024 13:26
88001264545 01.11.2024 13:26 01.11.2024 13:28

Должны схлопнуть в:
88001264545  01.11.2024 11:15  01.11.2024 11:24
88001264545 01.11.2024 12:00 01.11.2024 12:08
88001264545 01.11.2024 12:15 01.11.2024 13:28

(обратите внимание как 7 строк каскадно схлопнулись в одну)


Прикреплю скрин данных до обработки и после.
Также в комменты прикреплю скрипты создания таблицы и наполнения данными (для постгри).


Это реальный рабочий кейс и в целом типичная задача на схлопывание строк, которые дают на собесах.
Присылайте решения😊
Свои я опубликую в понедельник ближе к вечеру 💅

#sql #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
👍72🔥1
Разбор пятничной задачки.

Данные задачки решаются с помощью оконок и флагов (меток) 🤓❗️
Главное не запутаться.

Предлагаю свое решение:
WITH t1 AS ( -- проставляем флаги
SELECT t.*,
CASE WHEN end_t = LEAD(start_t) OVER (PARTITION BY phone_number ORDER BY start_t) THEN 1 ELSE 0 END AS start_lead, -- если end_t равен start_t след строки , ставим флаг 1
CASE WHEN start_t = LAG(end_t) OVER (PARTITION BY phone_number ORDER BY start_t) THEN 1 ELSE 0 END AS end_lag -- если start_t равен end_t пред строки, ставим флаг 1
FROM test_table t
)

SELECT DISTINCT phone_number,
CASE WHEN end_lag = 1 THEN LAG(start_t) OVER (PARTITION BY phone_number ORDER BY start_t) ELSE start_t END AS start_t,
CASE WHEN start_lead = 1 THEN LEAD(end_t) OVER (PARTITION BY phone_number ORDER BY start_t) ELSE end_t END AS end_t
FROM t1

-- строки с двумя флагами 1 надо отрезать
WHERE start_lead = 0
OR end_lag = 0
ORDER BY phone_number;


▪️Сначала проставляем флаги по нашей придуманной логике.
▪️Отрезаем лишние строки при помощи флагов.
▪️В последнем шаге правильно проставляем start_t и end_t.


В комментариях было выложено очень крутое правильное решение. Здесь классно используется накопительная сумма (оконка sum) и group by с min и max 👍

with t1 as (
select phone_number, start_t, end_t,
case when start_t = lag(end_t) over (partition by phone_number order by start_t) then 0 else 1 end as metka
from test_table),

t2 as (
select phone_number, start_t, end_t,
sum(metka) over (partition by phone_number order by start_t) as shlop
from t1)

select phone_number, min(start_t) as start_t, max(end_t) as end_t
from t2
group by 1, shlop
order by 1, 2


Решений таких задач можно много придумать. Полный разбор текстом не вижу смысла делать😄💅
Все скрипты создания таблицы и наполнения данными есть. Решения тоже есть. Кому интересно, посидите покрутите, будет точно полезно👍 На собеседование на мидла подобную задачу могут дать 💯

Если у кого еще появятся идеи, обязательно делитесь. Будем обсуждать😊

#sql #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥21🫡1
Привет, подписчики!😎

За 3,5 года работы в it у меня скопилось не мало интересной полезной информации.
Буду делиться ею с вами.

В комменты прикреплю две прикольных презенташки с классным дизайном:

1️⃣- BigData 2021 (да, чуть старовата)
2️⃣- Linux

Как по мне такое интересно полистать, сохранить и иногда возвращаться к основам.

Дайте обратную связи по презенташкам и интересно ли вам такое?

#полезная_инфа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍135🤝4🔥2
🔹Задача🔹

Задача была дана на собеседовании в одном из банков. Собеседование было на middle+.

📌Имеется таблица остатков rest_history.
▫️id_dog - id договора
▫️dt - дата изменения остатка
▫️balance - остаток на конце дня dt (0 или положительный)

Условия:
▫️ в таблице для каждого договора первой строкой является строка с ненулевым остатком.

Необходимо написать SQL-запрос:
▫️для каждого договора вычислить периоды, когда он имел ненулевой остаток;
▫️период закрывается датой dt-1 строки с нулевым остатком;
▫️eсли ненулевой остаток остается, то период закрывается датой 31.12.2999.

Тестовые данные (см. скрин):
with rest_history (id_dog, dt, balance) as (
select 111, to_date('10.07.2022', 'dd.mm.yyyy'), 10 union all
select 111, to_date('15.08.2022', 'dd.mm.yyyy'), 0 union all
select 111, to_date('20.09.2022', 'dd.mm.yyyy'), 15 union all
select 111, to_date('15.07.2022', 'dd.mm.yyyy'), 25 union all
select 111, to_date('15.07.2022', 'dd.mm.yyyy'), 35 union all
select 222, to_date('15.07.2022', 'dd.mm.yyyy'), 5 union all
select 222, to_date('15.08.2022', 'dd.mm.yyyy'), 7 union all
select 222, to_date('15.09.2022', 'dd.mm.yyyy'), 0 union all
select 222, to_date('03.03.2023', 'dd.mm.yyyy'), 33 union all
select 222, to_date('04.04.2023', 'dd.mm.yyyy'), 44 union all
select 222, to_date('10.05.2023', 'dd.mm.yyyy'), 0
) select * from rest_history


Результат после обработки скриптом:
111 | 10.07.2022 | 14.08.2022
111 | 20.09.2022 | 31.12.2999
222 | 15.07.2022 | 14.09.2022
222 | 03.03.2023 | 09.05.2023

Присылайте решения😊
Свои решения я опубликую на следующей недели 💅

it пингвин | data engineer 🐧

#sql #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62🔥1
Буллинг от руководителя

Осень 2021 года. Мое первое место работы в it было в суппорте BI портала одной большой телеком компании.
Это был очень важный проект для компании и его только разработали.

Набрали инженеров в суппорт, в том числе и меня. Их было четверо, четыре пацана. Кхм.. Нет. Нас было восемь, восемь джунов.
Работали мы 2/2 по 12 часов. Раскиданы по всей территории РФ, по разным часовым поясам. Таким образом наша команда дежурила 24/7.
Мы следили за дашбордами, если находили косяки заводили заявки на разработку или эксплуатацию, делали какие-то пересчеты, проводили консультации.


Мы были все джунами, примерно одного уровня. Знали sql, немного архитектуру. Кто-то имел опыт программирования в прошлом. У меня хардскиллы были средние, но я был очень ответственный. Все почему-то боялись брать задачки в работу. А я сразу понял что их все равно надо делать. И в итоге в конце года у меня было закрытых задач столько же сколько у остальной команды в сумме. Но эта история не обо мне.

Среди нас был один инженер более слабый. Он плохо знал sql и вообще не особо понимал, что от него хотят. И наша руководитель (недавно была обычным инженером и ее только повысили до руководителя) как-то быстро поняла, что он слабоват и начала его буллить. Она при всех часто подкалывала его, что он что-то не знает. Давала ему отдельные стремные задачи по sql, найти какие-то страницы в конфе и сделать из них доки, пересказать статьи, которые она сама присылала. То есть, когда у остальных инженеров было свободное время на работе, мы или кайфовали или занимались саморазвитием, а этот инженер делал бессмысленные задачки руководителя.

Самое неприятное когда она его чмырила за спиной. У нас созвон - я, два инженера и руководитель. И она его прям сильно обсирала - какой он ТУПОЙ (прям так и говорила), ничего не знает, не понимает. НЕ ПОМОГАЙТЕ ему выполнять задачи, пусть сам разбирается. На корпоративах точно также подкалывала, унижала. Этот инженер рассказывает какую-то историю, руководитель перебивает его и рассказывает свое. И такие вещи были во всем, лишь бы найти повод.

С остальными руководитель, наоборот, была доброжелательна, мило разговаривала и помогала.

И хочу уточнить - мы все были джунами, он не особо от нас отличался. Грубо говоря, ему нужно было просто подтянуть sql и чуть подробнее узнать про DWH.

Мне это все как-то сразу не очень понравилось. И этот инженер со мной общался лучше всех, я ему часто помогал и что-то объяснял. Мы решали sql задачки, лазили по процедурам, смотрели как работает Oracle BI и тд.
*Справедливости ради хочу отметить, иногда он сам даже особо не разбирался в вопросах/задачах, а сразу приходил ко мне. Я сначала в таких ситуациях помогал ему, потом стал пресекать и говорил, посмотри сначала вот это, сделай это и только потом возвращайся.

Что интересно, спустя почти 4 года из 8 инженеров в том суппорте работает только этот инженер, которого буллили. И как я знаю, его отношения с руководителем нормализовались.

Я об этом размышлял и мне кажется, что это тоже херовый показатель. Многие знают, что в суппорте работают или джуны или уходят на пенсию. А этот инженер до сих пор там сидит. Может быть ему там все нравится, может быть у него просто нет амбиций. А может он до сих пор добивается одобрения своего руководителя.

Такая вот маленькая история.. Что думаете по этому поводу? Интересно, были ли у вас подобные случаи?


it пингвин | data engineer 🐧

#трустори
5😢10👍92😱21🔥1🤬1😭1
Привет, подписчики!😎

Выкладываю решения по пятничной задачки.

Данные:
with rest_history (id_dog, dt, balance) as (
select 111, to_date('10.07.2022', 'dd.mm.yyyy'), 10 union all
select 111, to_date('15.08.2022', 'dd.mm.yyyy'), 0 union all
select 111, to_date('20.09.2022', 'dd.mm.yyyy'), 15 union all
select 111, to_date('15.07.2022', 'dd.mm.yyyy'), 25 union all
select 111, to_date('15.07.2022', 'dd.mm.yyyy'), 35 union all
select 222, to_date('15.07.2022', 'dd.mm.yyyy'), 5 union all
select 222, to_date('15.08.2022', 'dd.mm.yyyy'), 7 union all
select 222, to_date('15.09.2022', 'dd.mm.yyyy'), 0 union all
select 222, to_date('03.03.2023', 'dd.mm.yyyy'), 33 union all
select 222, to_date('04.04.2023', 'dd.mm.yyyy'), 44 union all
select 222, to_date('10.05.2023', 'dd.mm.yyyy'), 0
) select * from rest_history



1)

SELECT
id_dog, dt, new_dt
FROM
(
SELECT
id_dog, dt, balance,
COALESCE((LEAD(dt) OVER(PARTITION BY id_dog ORDER BY dt) - INTERVAL '1 day'),
to_date('31.12.2999', 'DD.MM.YYYY')) AS new_dt
FROM
(
SELECT
id_dog, dt, balance,
CASE WHEN COALESCE(LAG(balance) OVER(PARTITION BY id_dog ORDER BY dt), 0) = 0
THEN 1
ELSE 0
END AS bal_flg
FROM rest_history
) t1
WHERE bal_flg = 1 OR balance = 0
) t2
WHERE balance != 0
ORDER BY id_dog, dt


2)
,rest_history_l AS (
SELECT
ID_DOG,
DT,
BALANCE,
lag(BALANCE, 1, 0) OVER (PARTITION BY ID_DOG ORDER BY DT) AS BALANCE_L
FROM rest_history
)

SELECT
rl.ID_DOG,
to_char(rl.DT, 'DD.MM.YYYY') AS DATE_BEG,
COALESCE(
to_char(
(SELECT MIN(rl1.DT) - INTERVAL '1 day'
FROM rest_history_l rl1
WHERE rl1.BALANCE = 0 AND rl1.BALANCE_L <> 0
AND rl1.DT > rl.DT
AND rl1.ID_DOG = rl.ID_DOG),
'DD.MM.YYYY'),
'31.12.2999'
) AS DATE_END
FROM rest_history_l rl
WHERE BALANCE > 0 AND BALANCE_L = 0
ORDER BY ID_DOG, DT


3)
SELECT id_dog,
MIN(dt_start) AS dt_start,
COALESCE(dt_end, TO_DATE('31.12.2999', 'DD.MM.YYYY')) AS dt_end
FROM (
SELECT id_dog,
dt AS dt_start,
MIN(CASE WHEN balance = 0 THEN dt - INTERVAL '1 day' END)
OVER(PARTITION BY id_dog ORDER BY dt
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS dt_end
FROM rest_history
) t
GROUP BY id_dog, dt_end
ORDER BY id_dog, dt_end


Позапускайте решения, сравните разные реализации 👍

it пингвин | data engineer 🐧
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥6👍41🥰1🤬1
Друзья, я получил обратную связь, что даю сложные задачки🫠
Я с этим согласен 🤝👍


Скоро я сделаю краткий обзор собеседования с Газпромбанком✍️
После собеса мне прилетела положительная обратная связь и оффер 325к.💰

На одном из этапов мне давали легкие задачки (скорее загадки). По ним сделаю пост, вам должно понравиться 😁
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍43🤬1👌1
Вакансия: Старший ETL разработчик
Компания: IT_One (Проект Газпромбанка)
Предполагаемая вилка: 325к net (можно было 350 выбить)
Период собеседования:
Февраль 2025
Формат работы: Удаленка из РФ
Этапы собеседований:
HR-> Tech interview -> Tech interview -> Offer -> Rejected
Что будет на проекте:
Разработка sql в КХД банка на старой СУБД Sybase, отчетность для BI. В перспективе участие в миграции КХД на современный стек - S3, GP, ClickHouse, DBT, Spark/Flink, Airflow.

Краткая справка о процессе интервью:
Было два тех интервью - с руководством dwh банка и с командой.
На первом интервью в основном я рассказывал о своем опыте, потом дали несколько простых задач по sql (например, была задачка на накопительную сумму).

Второе интервью я запомню надолго:

Эта был вечер пятницы. Я говорил 1 на 1 с тимлидом команды. Исходя из разговора я понял, что интервьюер лежал в темноте на диване, говорил по телефону. Задавал мне загадки про вероятности(по ним сделаю пост) и болтал со мной о разных технологиях.
Диалог был максимально странный, но мне понравился😅

Позже подключился главный разработчик команды, и мы начали говорить про архитектуру dwh, про оптимизацию, разницу исторических и фактовых таблиц, задачка на self join. Моделировали таблицы - разраб спросил как мы будем хранить паспортные данные?
Еще был вопрос - Как работает накопительная сумма если встречается null?

Через 3 дня прислали оффер на 325к, я отказался, тк не захотел работать с СУБД Sybase (после работы на таком проекте моя ценность особо не выросла б). *+ уже был на руках более привлекательный оффер в другой банк.

Если бы я принял оффер, то был бы еще один этап - проверка психологом🤡


Как вам собеседование? Приняли бы оффер😁?

it пингвин | data engineer 🐧

#Собес
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥8🌚7👍4🤣2🤬1
Выкладываю долгожданные задачки с собеса на 325к😁

1. Бросаем две игральные кости (6 граней). С какой вероятностью выпадет две одинаковых цифры?

2. В комнате находится 3 человека. С какой вероятностью в этой комнате есть хотя бы два человека одного пола?


И это всё!🤣

Чтоб вы понимали, на собесе я впервые слышал эти и задачки/загадки и даже не сразу решил. Немного потупил, но все в слух рассуждал и решил. Интервьюеру понравилось, как я рассуждал, не зная ответ.

Можете в комменты выкладывать свои решения😄 ( ток скройте их)


Ии если у кого-то есть подобные задачки, скидывайте😊
К такому тоже нужно быть готовым на собеседовании 💯

it пингвин | data engineer 🐧

#Собес #задачи
👍14🤣72🔥1🤬11
Привет, подписчики!😎

Сейчас расскажу про полезные источники информации (темки)
*Скорее всего пост через время дропну.

1) Слив курсов 🥳🤩
https://s1.sharewood.co/

На шердвуде есть много сливов курсов. Видео все в хорошем качестве, теория и задания тоже есть (с ними бывают косяки). Но в любом случае вместо 100к за курс, можно бесплатно скачать 😊
Точнее бесплатно можно скачивать 1 раз в 3 дня вроде бы или купить недорогую подписку и скачивать все без ограничений (не вижу в этом смысла). Так что халявим по полной🤑
Там есть курсы Яндекса, Карпова, Нетологии и тд.
Я сам скачивал несколько курсов по дата инженерии.

И супер удобно у них есть бот @sharewood_bot. Можно искать по названиям курсов или по источникам.
В общем, разберетесь😁
Пользуйтесь и оставьте обратную связь здесь плз. Интересно как вам.


2) Слив it книг🤩
Вот несколько каналов где выкладывают книги.
▪️https://news.1rj.ru/str/book_sbornik
▪️https://news.1rj.ru/str/dbbooks и https://news.1rj.ru/str/readandget
▪️https://news.1rj.ru/str/dsbookru

Ставим реакции, если понравились темки⬇️
И оч важно, если у вас есть свои "интересные" источники делитесь в комментах.

it пингвин | data engineer 🐧

#полезная_инфа
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥297👍63👎1👀11
Продолжим историю с полезными презенташками 😎

Прошлые презентации можете взять здесь


Сегодня прикреплю следующий материал(продолжу нумерацию с прошлого поста):

3️⃣ Введение в Python
4️⃣ Python Advanced
5️⃣ MapReduce
6️⃣ HDFS

3,4 - люблю готовые ноутбуки, где можно идти по порядку запускать код, при желании что-то менять и сразу смотреть результат.
Открывайте с помощью jupyter notebook. *Если не знаете как это сделать, пишите, на след недели сделаю инструкцию 🤝

5 - презентация + программы + данные. Здесь нужно разбираться как все работает.

6 - просто классная презентация по hdfs


Совет по всем материал - при возможности изучайте все сразу. Иначе все будет складивароваться и только расти. У меня сейчас так. Стараюсь все разгребать😁

Дайте обратную связь, как вам материал?⬇️😊

it пингвин | data engineer 🐧

#полезная_инфа
Please open Telegram to view this post
VIEW IN TELEGRAM
16🔥32👎22👍1
Как удалить дубли из таблицы?

Это очень популярный вопрос на собеседовании lvl jun.
И это сложнее вопроса, где нужно просто найти дубли 😄

📌Допустим у нас есть таблица:

create table table_1
(id numeric,
name varchar(32));

insert into table_1 values(1, 'Jon');
insert into table_1 values(1, 'Jon');
insert into table_1 values(1, 'Jon');

insert into table_1 values(2, 'Sam');
insert into table_1 values(2, 'Sam');
commit;

select * from table_1;

id name

1 "Jon"
1 "Jon"
1 "Jon"
2 "Sam"
2 "Sam"


И нам нужно из 5 строк оставить только 2 уникальные.

Очень популярный НЕВЕРНЫЙ ответ:
Нумеруем оконкой все строки, оставляем все строки с номером 1:

WITH cte AS (
SELECT
id,
name,
ROW_NUMBER() OVER (PARTITION BY id,name ORDER BY id,name ) AS row_num
FROM
table_1
)
----
id name row_num

1 "Jon" 1
1 "Jon" 2
1 "Jon" 3
2 "Sam" 1
2 "Sam" 2

----
DELETE FROM table_1
WHERE id IN (
SELECT id FROM cte WHERE row_num > 1
);

Такой код удалит все строки!

Объясняю. В cte нумируем строки оконкой ROW_NUMBER().
Далее в delete мы хотим удалить все, где row_num > 1. Но под это условие попадают id=1 и id=2. Следовательно, delete удаляет все id с такими значениями. Таблица теперь пустая.

Нам нужно как-то разделить полностью уникальные строки.
В этом нам поможет скрытое системное поле, которое уникально идентифицирует строки и есть в каждой таблице. Такие поля есть во всех СУБД (возможны исключения 🤷‍♂️). В Oracle это поле называется rowid, в Postgresql - ctid.

Чуть переделаем предыдущий код:

WITH cte AS (
SELECT
id,
name,
ctid,
ROW_NUMBER() OVER (PARTITION BY id,name ORDER BY id,name ) AS row_num
FROM
table_1
)

----
id name ctid row_num

1 "Jon" "(0,41)" 1
1 "Jon" "(0,42)" 2
1 "Jon" "(0,43)" 3
2 "Sam" "(0,44)" 1
2 "Sam" "(0,45)" 2

----
DELETE FROM table_1
WHERE ctid IN (
SELECT ctid FROM cte WHERE row_num > 1
);


Теперь удалится только 3 строки, вместо 5.
Останется две уникальные.

id  name   

1 "Jon"
2 "Sam"


Или же можно удалить таким образом:

DELETE FROM table_1
WHERE ctid NOT IN (
SELECT MIN(ctid)
FROM table_1
GROUP BY id,name
);



Если дальше разгонять, то на самом деле можно придумать еще много способов для удаления дублей.
Например, таблицу с дублями переименовать в table_1_old. Создать новую таблицу table_1 и залить в нее данные из table_1_old без дублей (в select добавить distinct). После дропаем table_1_old.

Если таблица очень большая и партицированная, можно пробегаться по всем партициям в цикле и чистить каждую партицию отдельно.

* У меня есть оракловый pl sql cкрипт, который удаляет дубли в таблице через курсор и коллекции. Такой вариант на больших данных будет быстрее работать и не будет блочить всю таблицу. Кому нужен скрипт пишите, пришлю.

Также на собеседовании (да и на реальных кейсах) будет полезно упомянуть, что перед удалением нужно сделать бэкап и сохранить, что мы удаляем, для дальнейшего разбора. Нужно понять почему эти дубли вообще появились.


Как вам инфа? Пишите свои варианты удаления дублей или какие-то еще тонкости и уточнения по данному вопросу? Жду реакций ⬇️😊

it пингвин | data engineer 🐧

#sql #база #jun #Вопросы_с_собесов
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍16🔥5322
Привет, подписчики!😎

Хочу порекомендовать вам несколько каналов по нашей тематике - "data".
Каналы интересные, я на них давно подписан и постоянно что-то комментирую)
Пройдите по ссылочкам, изучите и кому что-нибудь понравится обязательно подписываемся 😁


📌 Data Brew:
личный блог продуктового аналитика на пути к позиции лида, про софты и харды,иногда помогает найти работу.

📌 Из юриста в аналитики: канал джуна риск-аналитика, в котором я рассказываю о сложностях смены профессии и своём пути в аналитике.

📌 АННА В ДАННЫХ: заглянуть в жизнь опытного продуктового аналитика - искренние истории и проверенные временем рекомендации для вашей карьеры.

📌 Data Engineer lab: канал про обзор инструментов и технологий Data Engineering и Data Science с типичными вопросами по ним на собеседованиях.

📌 Бегущий по лезвию данных: снятся ли тридцатилетним вкатунам офферы?


it пингвин | data engineer 🐧

#полезная_инфа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7😁55🔥2🤬2🤣1
ПОСТЫ В АПРЕЛЕ ✍️

Привет, товарищи🤝 Всех с праздником⭐️!

Попробую тоже подводить дайджест постов в конце месяца:

📌 Полезное:

Обход замедления ютуба
Презенташки 1, 2
Слив курсов и книг 🤑
Презенташки 3, 4, 5, 6

📌 Вопросы/задачи:

Что такое хранилище данных?
Задача на схлопывание строк и разбор
Сложная задача на периоды и разбор
Как удалить дубли из таблицы?

📌 Разное:

Стандартизация SQL
Буллинг от руководителя
Опрос про идеальный вариант работы в it
Обзор собеседования в Газпромбанк на 325к
Загадки с собеса 😁


Как вам посты? Что больше всего понравилось?
Вроде бы в апреле я был продуктивен 😄
Реакций ⬇️😊

it пингвин | data engineer 🐧

#посты_месяца
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍104🐳21💅1
Всем привет 👋

Я же сейчас на испытательном сроке, второй месяц заканчивается. И вот наконец-то я получил доступы и мне дали задачи.. Теперь нужно работать 🤡😩

Как у вас проходит рабочий понедельник после майских выходных?)

Кстати нас уже 500 человек 🎉❤️
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣25🔥93👍3
🔹Задача🔹

Пусть существует таблица exam, в котором указаны:
- student_id (идентификатор студента)
- exam_id (идентификатор экзамена)
- mark (оценка)

Таблица exam
student_id     exam_id    mark

1 1 4
1 2 3
1 3 5
2 1 5
2 2 5
2 3 5
3 1 4
3 2 4
3 3 3


Необходимо вывести всех студентов, у которых за все время не было оценки ниже 4.


Задачи я беру из заметок и все они были на собеседованиях (необязательно у меня). Эта задачка lvl jun.

Присылайте решения😊⬇️

it пингвин | data engineer 🐧

#sql #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥211💅11
С Великим праздником, с Днем Победы!⭐️🇷🇺❤️
Please open Telegram to view this post
VIEW IN TELEGRAM
5🎉237👍4🫡3🙏2🔥1