60 lines
1.8 KiB
SQL
60 lines
1.8 KiB
SQL
--Типы данных
|
|
|
|
--Задача 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;
|
|
|