DQL
WITH expression
from david8.expressions import col as c
from david8.expressions import interval
from david8.expressions import val as v
from david8.functions import sub
from david8.predicates import between, eq_c
from david8_clickhouse.functions import to_date
(
qb
.with_expr(
v('2026-06-01 15:23:00').as_('ts_upper_bound'),
to_date('ts_upper_bound').as_('event_date'),
sub('ts_upper_bound', interval().hour(1)).as_('ts_lower_bound'),
)
.select('*')
.from_table('hits')
.where(
eq_c('EventDate', 'event_date'),
between('EventTime', c('ts_lower_bound'), c('ts_upper_bound'))
)
).get_sql()
# WITH '2026-06-01 15:23:00' AS ts_upper_bound,
# toDate(ts_upper_bound) AS event_date,
# (ts_upper_bound - INTERVAL 1 HOUR) AS ts_lower_bound
# SELECT * FROM hits
# WHERE EventDate = event_date AND
# EventTime BETWEEN ts_lower_bound AND ts_upper_bound
ARRAY JOIN
from david8.expressions import col, val
from david8_clickhouse import get_qb
from david8_clickhouse.joins import array_join, left_array_join
query = (
qb
.select('column', 'array_column')
.from_table('table_name')
.join(array_join('array_column'))
)
# SELECT column, array_column FROM table_name ARRAY JOIN array_column
LEFT ARRAY JOIN
query = (
qb
.select('column', 'array_column', 'array_column2')
.from_table('table_name')
.join(left_array_join(
col('array_column').as_('alias1'),
col('array_column2').as_('alias2'))
)
)
# SELECT column, array_column, array_column2 FROM table_name
# LEFT ARRAY JOIN array_column AS alias1, array_column2 AS alias2
FINAL
qb.select('name').from_table('events', final=True) # SELECT name FROM events FINAL
SAMPLE
qb.select('*').from_table('visits').sample(10000000) # SELECT * FROM visits SAMPLE 10000000
qb.select('*').from_table('visits').sample(0.1, 0.5) # SELECT * FROM visits SAMPLE 0.1 OFFSET 0.5
LIMIT BY
qb.select('*').from_table('tbl').limit_by()
# SELECT * FROM tbl LIMIT BY ALL
qb.select('*').from_table('tbl').limit_by('col1', limit=10, offset=50).limit(100)
# SELECT * FROM tbl LIMIT 10, 50 BY col1 LIMIT 100