--Типы данных --Задача 1 CREATE TABLE raw_data ON CLUSTER clickhouse_cluster ( user_id String, balance String, created_at String ) ENGINE = MergeTree ORDER BY tuple(); SELECT DISTINCT toDecimal64OrNull(balance, 2) AS balance_decimal, toDateTime64OrNull(created_at, 3) AS created_at_date FROM raw_data WHERE toDecimal64OrNull(balance, 2) IS NOT NULL AND toDateTime64OrNull(created_at, 3) IS NOT NULL /* CAST(balance AS Decimal(10, 2)) - этом случае будет ошибка, так как данный метод не поддеживает NULL Следующие два метода по сути своей преобразование типа данных с условием ИЛИ, то есть: toDecimal64OrNull(balance, 2) - в этом методе на выходе будут корректные данные, в противном случае NULL toDecimal64OrZero(balance, 2) - аналогично с NULL, только будет ноль. */ --Задача 2 CREATE TABLE events ON CLUSTER clickhouse_cluster ( event_id String, event_date String, -- форматы: "2023-01-01", "01.02.2023", "invalid" event_time String -- форматы: "12:30:45", "25:99:99" ) ENGINE = MergeTree ORDER BY event_id; --Заполнил данными для проверки INSERT INTO events (event_id, event_date, event_time) VALUES ('1', '2023-01-01', '12:30:45'), ('2', '01.02.2023', '08:15:00'), ('3', 'invalid', '25:99:99'), ('4', '2023-05-20', 'invalid'), ('5', '31.12.2023', '23:59:59'); SELECT * FROM events; SELECT DISTINCT toDate(DateTime_Valid) AS Event_Date, toHour(DateTime_Valid) AS Event_Hour, DateTime_Valid FROM ( SELECT parseDateTimeBestEffortOrNull(concat(event_date, ' ', event_time)) AS DateTime_Valid FROM events ) WHERE DateTime_Valid IS NOT NULL;