|
| 1 | +-- 1. Очистка (на случай повторного запуска) и создание таблицы |
| 2 | +DROP TABLE IF EXISTS products; |
| 3 | + |
| 4 | +CREATE TABLE products ( |
| 5 | + id UInt64, |
| 6 | + name String, |
| 7 | + category String, |
| 8 | + price Decimal(10, 2), |
| 9 | + stock_quantity Int32 DEFAULT 0, |
| 10 | + sku String, |
| 11 | + is_available UInt8 DEFAULT 1, |
| 12 | + created_at DateTime DEFAULT now(), |
| 13 | + updated_at DateTime DEFAULT now() |
| 14 | +) ENGINE = MergeTree() |
| 15 | +ORDER BY (id, created_at); |
| 16 | + |
| 17 | +-- 2. Вставка 100 записей |
| 18 | +-- В ClickHouse numbers(n) возвращает колонку number (0..n-1), используем подзапрос для 1..100 |
| 19 | +INSERT INTO products (name, category, price, stock_quantity, sku, created_at, updated_at) |
| 20 | +SELECT |
| 21 | + 'Товар ' || toString(i), |
| 22 | + multiIf(i % 5 = 0, 'Электроника', i % 5 = 1, 'Одежда', i % 5 = 2, 'Дом', i % 5 = 3, 'Спорт', 'Книги'), |
| 23 | + round(rand() * 5000 + 100, 2), |
| 24 | + toInt32(floor(rand() * 1000)), |
| 25 | + 'ART-' || toString(round(rand() * 5000 + 100)), |
| 26 | + now(), |
| 27 | + now() |
| 28 | +FROM (SELECT number + 1 AS i FROM numbers(100)); |
| 29 | + |
| 30 | +-- 3. Обновление 17 случайных записей (ClickHouse mutations) |
| 31 | +-- Сначала получаем ID через подзапрос (mutations выполняются асинхронно) |
| 32 | +ALTER TABLE products UPDATE |
| 33 | + price = round(price * 1.3, 2), |
| 34 | + stock_quantity = greatest(0, stock_quantity - toInt32(floor(rand() * 10))), |
| 35 | + updated_at = now() |
| 36 | +WHERE id IN ( |
| 37 | + SELECT id FROM products ORDER BY rand() LIMIT 17 |
| 38 | +); |
| 39 | + |
| 40 | +-- Дождаться завершения мутации (опционально, для проверки) |
| 41 | +-- SELECT * FROM system.mutations WHERE table = 'products' AND is_done = 0; |
| 42 | + |
| 43 | +-- 4. Проверка результатов (обновлённые записи) |
| 44 | +SELECT id, name, price, stock_quantity, created_at, updated_at |
| 45 | +FROM products |
| 46 | +WHERE updated_at > created_at |
| 47 | +ORDER BY price DESC |
| 48 | +LIMIT 50; |
| 49 | + |
| 50 | +-- 4. Проверка products_clone (если dataflow уже скопировал данные) |
| 51 | +-- Примечание: dataflow по умолчанию создаёт таблицу с колонками (data String, created_at). |
| 52 | +-- Для такой же схемы, как products, создайте products_clone вручную или настройте трансформации. |
| 53 | +SELECT id, name, price, stock_quantity, created_at, updated_at |
| 54 | +FROM products_clone |
| 55 | +WHERE updated_at > created_at |
| 56 | +ORDER BY price DESC |
| 57 | +LIMIT 50; |
| 58 | + |
| 59 | +-- 4. Проверка products_raw_clone (raw-режим с _metadata) |
| 60 | +SELECT id, value, _metadata, created_at, updated_at, deleted_at |
| 61 | +FROM products_raw_clone |
| 62 | +WHERE updated_at > created_at |
| 63 | +ORDER BY id DESC |
| 64 | +LIMIT 50; |
| 65 | + |
| 66 | +-- Подсчёт записей |
| 67 | +SELECT count(*) FROM products; |
| 68 | +SELECT count(*) FROM products_clone; |
| 69 | +SELECT count(*) FROM products_raw_clone; |
| 70 | + |
| 71 | +-- 5. Удаление дубликатов в products_clone, оставляя последнюю запись по id |
| 72 | +-- В ClickHouse нет ctid; используем ReplacingMergeTree или пересоздание таблицы |
| 73 | + |
| 74 | +-- Вариант A: Если products_clone — ReplacingMergeTree(updated_at), достаточно: |
| 75 | +-- OPTIMIZE TABLE products_clone FINAL; |
| 76 | + |
| 77 | +-- Вариант B: Пересоздание таблицы с дедупликацией через argMax |
| 78 | +DROP TABLE IF EXISTS products_clone_dedup; |
| 79 | +CREATE TABLE products_clone_dedup AS products_clone; |
| 80 | + |
| 81 | +INSERT INTO products_clone_dedup |
| 82 | +SELECT |
| 83 | + id, |
| 84 | + argMax(name, updated_at) AS name, |
| 85 | + argMax(category, updated_at) AS category, |
| 86 | + argMax(price, updated_at) AS price, |
| 87 | + argMax(stock_quantity, updated_at) AS stock_quantity, |
| 88 | + argMax(sku, updated_at) AS sku, |
| 89 | + argMax(is_available, updated_at) AS is_available, |
| 90 | + argMax(created_at, updated_at) AS created_at, |
| 91 | + argMax(updated_at, updated_at) AS updated_at |
| 92 | +FROM products_clone |
| 93 | +GROUP BY id; |
| 94 | + |
| 95 | +RENAME TABLE products_clone TO products_clone_old; |
| 96 | +RENAME TABLE products_clone_dedup TO products_clone; |
| 97 | +DROP TABLE products_clone_old; |
0 commit comments