Собес на деньги:
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
)
