Что может пойти не так?
Месяц назад выкладывала тут задание про поиск клиентов, у которых более 70% пользователей с именами на латинице. Сделала его на питоне. Питон крут и все такое.
Но есть проблемка.. выгрузки по 50 млн строк и питон хоть и тянет, но обрабатывает дооолго. Решила переписать на SQL. Но не просто SQL, а для Clickhouse. Ему такое – море по колено.🌊
Стала искать гуглить про регулярки для Clickhouse. И вот, что нашла:
match(где ищем, шаблон)
Сначала
concat соединяю фамилию и имя пользователя, а потом оборачиваю в
match и вторым аргументом прописываем
[A-Za-z] – ищем английские буквы как в большом, так и в малом регистре. А потом заворачиваем все это безобразие в
sum, чтобы посчитать количество пользователей так как результат match выдает единички напротив каждого с английскими буквами (смотрим пример на картинке).
SUM(MATCH(CONCAT(IFNULL(uu.first_name,''),' ',IFNULL(uu.last_name,'')), '[A-Za-z]')) as has_latin_letters
Чтобы прописать сразу и rate пишем вот так:
select uu.ACCOUNT_ID,
count(uu.id) as all,
SUM(MATCH(CONCAT(IFNULL(uu.first_name,''),' ',IFNULL(uu.last_name,'')), '[A-Za-z]')) as has_latin_letters,
round((sum(match(CONCAT(IFNULL(uu.first_name,''),' ',IFNULL(uu.last_name,'')), '[A-Za-z]'))/
count(uu.id))*100,2) as rate
from user.user uu
where uu.ACCOUNT_ID in {tuple(df_accounts['account_id'])}
and uu.deleted = 0
and uu.type = 'user'
group by uu.ACCOUNT_ID
В результате скрипт летает как Карлсон в самом расцвете сил 🚀
Обсуждение 15
Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.
Обсудить в Telegram