@newPsevdonim
Python разработчик

Где ошибка в данном sql запросе?

У меня есть следующий sql запрос:

"select * from"
               "(select toStartOfInterval(time_local, interval 3600 second) as interval, remote_addr, "
               "count(distinct http_user_agent), count(http_user_agent) "
               "from accesslog.default where time_local > (now() - toIntervalMinute(240)) "
               "group by interval, remote_addr order by interval, remote_addr) as t1"
               "inner join"
               "(select * from accesslog.default where time_local > (now() - toIntervalMinute(240))) as t2 "
               "on t1.remote_addr=t2.remote_addr"


Но при выполнение я получаю ошибку
DB::Exception: Missing columns: 't1.remote_addr' while processing query


(По отдельности select запросы работают)

Дополнено:
Первый запрос:
time_local                                             remote_addr

datetime.datetime(2022, 10, 21, 11, 0), IPv4Address('1.1.1.1'), 1, 2)

Второй запрос:
bytes      remote_addr                  http_user_agent
62,  IPv4Address('1.1.1.1'),  'Ubrd/13337 CFNetwork/1335.0.3 Darwin/21.6.0',
  • Вопрос задан
  • 506 просмотров
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
Если нормально отформатировать, получается
SELECT *
FROM (
    SELECT toStartOfInterval(time_local, interval 3600 SECOND) AS interval,
           remote_addr,
           count(DISTINCT http_user_agent),
           count(http_user_agent)
    FROM accesslog.default
    WHERE time_local > (now() - toIntervalMinute(240))
    GROUP BY interval, remote_addr
    ORDER BY interval, remote_addr
    ) AS t1
INNER JOIN (
    SELECT *
    FROM accesslog.default
    WHERE time_local > (now() - toIntervalMinute(240))
    ) AS t2 ON t1.remote_addr=t2.remote_addr

Так хорошо видно, что к собственно запросу претензий быть не должно.

А то, что сам кликхаус в процессе выполнения протерял одно поле подзапроса - это именно к нему, а не к запросу, претензии.. может, данных многовато, а оперативки в обрез?
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
flapflapjack
@flapflapjack
на треть я прав
В цвете же можно выложить!
select * from
               (select toStartOfInterval(time_local, interval 3600 second) as interval, remote_addr, 
               count(distinct http_user_agent), count(http_user_agent) 
               from accesslog.default where time_local > (now() - toIntervalMinute(240)) 
               group by interval, remote_addr order by interval, remote_addr) as t1
               inner join
               (select * from accesslog.default where time_local > (now() - toIntervalMinute(240))) as t2 
               on t1.remote_addr=t2.remote_addr

и покажите вывод запросов отдельно с именами столбцов в выводе
Ответ написан
unfilled
@unfilled
В доке пишут:
Taking all the columns via * is available only if tables are joined, not subqueries.


и не уверен на счёт сортировки в первом подзапросе

upd: и попробуйте добавить алиасы для count'ов в первом подзапросе
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы