TGViewer
Я – Дата Инженер | Евгений Виндюков Я – Дата Инженер | Евгений Виндюков @halltape_data · 5.89K subscribers
Post #898 3.2K
Как же мне было влом решать задачу!

Собес на деньги:
320к - 350к на руки


Скажу честно, когда вижу задачу на собесе с лайвкодингом, сразу хочется просто скопировать в LLM и выдать ответ. Потому что оно реально так и решается. Я просто потерял смысл попыток решений таких задач. Кто пишет код вручную.. ну скорее всего сын маминой подруги. И тот самый айтишник, который в ОЙТИ еще со времен Рюрика. Кстати, выражаю огромный респект всем трушным программистам. Сейчас ОЙТИ уже не то...

Я в этот раз решил честно все пройти, попробовать. Но, как же мне было влом... Ну буквально надо вырыть яму лопатой, когда рядом стоит эксаватор)
Я написал где-то четверть и полностью забил на все нюансы из условий задачи.
Задача на мой взгляд непростая. В плане надо сразу несколько условий держать в голове. Плюс это CLICKHOUSE.

Какая компания, говорить не буду. Ну либо за 1млн долларов.
Есть таблица ClickHouse:

CREATE TABLE default.migration_report
(
RunId UUID,
CollectionName String,
DocumentName String,
StartedAt Nullable(DateTime),
CompletedAt Nullable(DateTime),
LastError String
)
ENGINE = ReplacingMergeTree
ORDER BY RunId
SETTINGS index_granularity = 8192;

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

Результат должен содержать два столбца:

| succeeded | failed |

Условия:

1. Расчёт выполняется отдельно для каждого источника (`CollectionName`) и каждого календарного дня.
2. В течение одного дня у одного источника может быть несколько загрузок.
3. Если у источника произошла неуспешная загрузка (`LastError != ''`), то эта загрузка учитывается как failed, а все последующие загрузки этого источника в этот же день не учитываются.
4. Успешной считается загрузка, у которой `LastError = ''`.
5. Для преобразования даты и времени можно использовать функцию `toDate()`.

Напишите SQL-запрос для ClickHouse.


Решение задачи

WITH
toStartOfMonth(addMonths(today(), -1)) AS month_start,
toStartOfMonth(today()) AS month_end
SELECT
countIf(LastError = '' AND previous_failed = 0) AS succeeded,
countIf(LastError != '' AND previous_failed = 0) AS failed
FROM
(
SELECT
CollectionName,
toDate(StartedAt) AS upload_date,
LastError,

sum(LastError != '') OVER
(
PARTITION BY CollectionName, toDate(StartedAt)
ORDER BY StartedAt, RunId
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
) AS previous_failed
FROM default.migration_report
WHERE StartedAt >= month_start
AND StartedAt < month_end
)
  • 👍 17
  • ❤ 7
  • 🔥 6
  • 🤔 1
More from @halltape_data
  1. Sep 25, 2026Это последний поток BootCamp. ВСЁ. После Нового года мы будем поднимать цену. Поэтому нояб…
  2. Sep 23, 2026Если тебе до 25 и ты уже в IT В промежутке между 17 и 23 годами я учился на инженера в уни…
  3. Sep 20, 2026Собес на Дата Инженера + Лайвкодинг! (Middle) ▶️ https://youtu.be/fypWIMVBKxg На самом дел…
  4. Sep 18, 2026300к в наносекунду от нашего ученика! Я хз как это работает, но это уже второй рекордсмен,…
  5. Sep 16, 2026Упаковка опыта Друзья, если кому надо упаковать свой опыт для резюме, то рекомендую наш се…
  6. Sep 15, 2026☁️☁️☁️☁️☁️☁️☁️ Дата-инженерия — это не только про ETL и пайплайны, это ещё и про то, куда…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →