#sql #clickhouse
Вопрос:
Clickhouse выдает мне ошибку, когда я пытаюсь присоединиться только к одному столбцу, но не когда я добавляю предложение о равенстве. Почему?
Примеры таблиц:
orders:
┌─time─┬─price─┬─id─┐
│ 0 │ 4 │ 3 │
│ 1 │ 4 │ 3 │
│ 2 │ 4 │ 3 │
│ 3 │ 3 │ 3 │
│ 4 │ 2 │ 3 │
│ 5 │ 1 │ 3 │
│ 6 │ 1 │ 3 │
trades:
┌─time─┬─qty─┬─id─┐
│ 2 │ 100 │ 3 │
│ 4 │ 200 │ 3 │
│ 5 │ 205 │ 3 │
Давайте сначала попробуем ПРИСОЕДИНИТЬСЯ только к колонке времени.
SELECT
time,
price,
qty
FROM orders
ASOF INNER JOIN trades ON trades.time >= orders.time
ORDER BY time ASC
Received exception from server (version 21.7.5):
Code: 403. DB::Exception: Received from localhost:9000. DB::Exception: Cannot get JOIN keys from JOIN ON section: trades.time >= time.
Теперь давайте сделаем то же самое, за исключением того, что мы также присоединимся к фиктивному столбцу (id).
SELECT
time,
price,
qty
FROM orders
ASOF INNER JOIN trades ON (trades.id = orders.id) AND (trades.time >= orders.time)
ORDER BY time ASC
┌─time─┬─price─┬─qty─┐
│ 0 │ 4 │ 100 │
│ 1 │ 4 │ 100 │
│ 2 │ 4 │ 100 │
│ 3 │ 3 │ 200 │
│ 4 │ 2 │ 200 │
│ 5 │ 1 │ 205 │
└──────┴───────┴─────┘
Комментарии:
1. посмотрите на clickhouse.tech/docs/en/sql-ссылка/инструкции/выберите/присоединиться/… — Для присоединения требуется одно или несколько условий равенства и ровно одно условие ближайшего соответствия.
2. В документах говорится: «Не может быть единственным столбцом в предложении JOIN», но далее они также говорят: «Вы можете использовать любое количество условий равенства…» Возможно, объединение в одном столбце просто недопустимо, но тогда мой вопрос был бы: почему бы и нет?
3. да, «специальный столбец» — это столбец, используемый для определения условия ближайшего соответствия. ASOF требует одного или нескольких условий равенства и ровно одного условия ближайшего соответствия.
4. Понял, спасибо. Знаете ли вы причину, по которой Clickhouse делает условие равенства обязательным?
5. Потому что именно так работает HashJoin, иначе это будет декартово произведение. Кстати, некоторое время назад CH разрешил
ASOF JOIN trades ON (1=1 and trades.time >= orders.time)