LIKE (Transact-SQL)
Определяет, совпадает ли указанная символьная строка с заданным шаблоном. Шаблон может включать обычные символы и символы-шаблоны. Во время сравнения с шаблоном необходимо, чтобы его обычные символы в точности совпадали с символами, указанными в строке. Символы-шаблоны могут совпадать с произвольными элементами символьной строки. Использование wild карта символов делает LIKE оператор более гибким, чем с помощью = операторов сравнения строк и != строк. Если один из аргументов не является типом данных строки символов, SQL Server ядро СУБД преобразует его в тип данных строки символов, если это возможно.
Синтаксис
Синтаксис для SQL Server и Базы данных SQL Azure:
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]
Синтаксис для Azure Synapse Analytics и Parallel Data Warehouse:
match_expression [ NOT ] LIKE pattern
ESCAPE и STRING_ESCAPE не поддерживаются в Azure Synapse Analytics или analytics Platform System (PDW).
Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.
Аргументы
match_expression
Любое допустимое выражение типа данных символов.
pattern
Определенная строка символов для поиска в match_expression и может содержать допустимые дикие карта символы в следующей таблице. Длина значения pattern не может превышать 8000 байт.
Если match_expression является более высоким приоритетом типа данных, чем шаблон, и длина шаблона больше match_expression, при неявном преобразовании значения шаблона в тип match_expression будет возникать ошибка усечения.
| Символ-шаблон | Description | Пример |
|---|---|---|
| % | Любая строка, содержащая ноль или более символов. | WHERE title LIKE ‘%computer%’ находит все названия книги со словом computer в любом месте в названии книги. |
| и символ подчеркивания ( _ ). | Любой одиночный символ. | WHERE au_fname LIKE ‘_ean’ находит все четыре буквы первых имен, которые заканчиваются ean ( Dean , Sean и т. д.). |
| [ ] | Любой отдельный символ в указанном диапазоне [a-f] или наборе [abcdef] . | WHERE au_lname LIKE ‘[C-P]arsen’ находит фамилии автора, заканчивающиеся и начиная с arsen любого отдельного символа между C и P , например Carsen , Larsen и Karsen т. д. При выполнении операции поиска в диапазоне символы, включенные в диапазон, могут изменяться в зависимости от правил сортировки параметров сортировки. |
| [^] | Любой отдельный символ, не в пределах указанного диапазона [^a-f] или набора [^abcdef] . | WHERE au_lname LIKE ‘de[^l]%’ находит все фамилии автора, начиная с de и где не указано l следующее письмо. |
escape_character
Символ, помещенный перед диким карта символом, чтобы указать, что дикий карта интерпретируется как обычный символ, а не как дикий карта. Аргумент escape_character является символьным выражением, не имеющим значения по умолчанию и возвращающим результат в виде одного символа.
Тип результата
Boolean
Значение результата
LIKE возвращает значение TRUE, если match_expression соответствует указанному шаблону.
Замечания
При сравнении строк с помощью LIKE все символы в строке шаблона являются значительными. К значимым символам также относятся начальные и конечные пробелы. Если сравнение в запросе заключается в возврате всех строк со строкой LIKE ‘abc ‘ ( abc за которым следует одно пробел), строка, в которой значение этого столбца ( abc abc без пробела) не возвращается. Однако завершающие пробелы в выражении, с которым сравнивается шаблон, не учитываются. Если сравнение в запросе заключается в возврате всех строк со строкой LIKE ‘abc’ ( abc без пробела), возвращаются все строки, начинающиеся с abc нуля или более конечных пустых.
Сравнение строк с использованием шаблона, содержащего данные char и varchar , может не передавать LIKE сравнение из-за того, как данные хранятся для каждого типа данных. В следующем примере передается локальная переменная char в хранимую процедуру, а затем используется сопоставление шаблонов для поиска всех сотрудников, фамилии которых начинаются с указанного набора символов.
-- Uses AdventureWorks CREATE PROCEDURE FindEmployee @EmpLName CHAR(20) AS SELECT @EmpLName = RTRIM(@EmpLName) + '%'; SELECT p.FirstName, p.LastName, a.City FROM Person.Person p INNER JOIN Person.Address a ON p.BusinessEntityID = a.AddressID WHERE p.LastName LIKE @EmpLName; GO EXEC FindEmployee @EmpLName = 'Barb'; GO
Выполнение процедуры FindEmployee не дает результатов, так как переменная типа char ( @EmpLName ) всегда имеет длину в 20 символов, до которой дополняется завершающими знаками пробела. Переменные, содержащиеся в столбце LastName , имеют тип varchar. Поэтому завершающие пробелы в них не дописываются. Данная процедура завершается неудачей, так как завершающие пробелы учитываются.
Процедура из следующего примера выполняется успешно, так как завершающие пробелы к переменной типа varchar не добавляются.
-- Uses AdventureWorks CREATE PROCEDURE FindEmployee @EmpLName VARCHAR(20) AS SELECT @EmpLName = RTRIM(@EmpLName) + '%'; SELECT p.FirstName, p.LastName, a.City FROM Person.Person p INNER JOIN Person.Address a ON p.BusinessEntityID = a.AddressID WHERE p.LastName LIKE @EmpLName; GO EXEC FindEmployee @EmpLName = 'Barb'; GO
FirstName LastName City ---------- -------------------- --------------- Angela Barbariol Snohomish David Barber Snohomish (2 row(s) affected)
Сопоставление шаблонов с помощью LIKE
LIKE поддерживает сопоставление шаблонов ASCII и сопоставление шаблонов Юникода. Если все аргументы (match_expression, pattern и escape_character, если он указан) имеют символьный тип ASCII, то применяется шаблон ASCII. Если один из аргументов имеет тип данных Юникода, все аргументы преобразуются в Юникод и выполняется сопоставление шаблонов Юникода. При использовании данных Юникода (nchar или nvarchar ) с LIKE конечными пустыми являются значительными, однако для данных, отличных от Юникода, конечные пробелы не являются значительными. Юникод LIKE совместим со стандартом ISO. ASCII LIKE совместим с более ранними версиями SQL Server.
В следующем ряде примеров показаны различия в строках, возвращаемых между ASCII и сопоставлением шаблонов Юникода LIKE .
-- ASCII pattern matching with char column CREATE TABLE t (col1 CHAR(30)); INSERT INTO t VALUES ('Robert King'); SELECT * FROM t WHERE col1 LIKE '% King'; -- returns 1 row -- Unicode pattern matching with nchar column CREATE TABLE t (col1 NCHAR(30)); INSERT INTO t VALUES ('Robert King'); SELECT * FROM t WHERE col1 LIKE '% King'; -- no rows returned -- Unicode pattern matching with nchar column and RTRIM CREATE TABLE t (col1 NCHAR(30)); INSERT INTO t VALUES ('Robert King'); SELECT * FROM t WHERE RTRIM(col1) LIKE '% King'; -- returns 1 row
LIKE сравнения влияют на параметры сортировки. Дополнительные сведения см. в статье COLLATE (Transact-SQL).
Использование дикого карта символа %
LIKE ‘5%’ Если задан символ, ядро СУБД ищет число 5 , за которым следует любая строка нулевых или более символов.
Например, при выполнении следующего примера отображаются все динамические административные представления базы данных AdventureWorks2022 , так как все они начинаются символами dm .
-- Uses AdventureWorks SELECT Name FROM sys.system_views WHERE Name LIKE 'dm%'; GO
Чтобы отобразить все объекты, не являющиеся динамическими административными представлениями, используется синтаксис NOT LIKE ‘dm%’ . Если у вас есть 32 объекта и LIKE найдено 13 имен, которые соответствуют шаблону, NOT LIKE находит 19 объектов, которые не соответствуют шаблону LIKE .
По такому шаблону, как LIKE ‘[^d][^m]%’ , не всегда будут возвращаться одни и те же имена. Вместо 19 имен можно найти только 14, так как имена, которые начинаются с буквы d или у которых второй буквой является m , будут исключены из результата, как и имена динамических административных представлений. Причиной такой реакции на событие является поэтапный поиск отрицательных символов-шаблонов: за один шаг обрабатывается один символ-шаблон. Процесс поиска совпадений прекращается при возникновении сбоя на любой стадии выполнения.
Используйте дикие карта символы в качестве литерала
Символы-шаблоны могут быть использованы в качестве литералов. Чтобы использовать символ-шаблон в качестве литерала, его необходимо заключать в скобки. В следующей таблице показаны несколько примеров использования LIKE ключевое слово и [ ] диких символов карта.
| Символ | Значение |
|---|---|
| LIKE ‘5[%]’ | 5% |
| LIKE ‘[_]n’ | _n |
| LIKE ‘[a-cdf]’ | a , b , c , d или f |
| LIKE ‘[-acdf]’ | — , a , c , d или f |
| LIKE ‘[ [ ]’ | [ |
| LIKE ‘]’ | ] |
| LIKE ‘abc[_]d%’ | abc_d и abc_de . |
| LIKE ‘abc[def]’ | abcd , abce и abcf |
Сопоставление шаблонов с предложением ESCAPE
Можно искать символьные строки, в состав которых входит один или более специальных символов-шаблонов. Например, таблица discounts базы данных customers может содержать значения скидок, включающих знак процента (%). Чтобы выполнить поиск знака процента в качестве символа-шаблона, необходимо ввести ключевое слово ESCAPE и escape-символ. Например, образец базы данных содержит столбец с именем comment, в котором хранится значение «30%». Чтобы найти строки, содержащие последовательность символов «30%» в столбце comment, необходимо указать предложение WHERE, например WHERE comment LIKE ‘%30!%%’ ESCAPE ‘!’ . Если escape-код и escape-символ не указаны, ядро СУБД возвращает строки со строкой 30! .
Если в шаблоне LIKE после escape-символа нет никакого символа, то шаблон является недопустимым и оператор LIKE возвращает значение FALSE. Если символ после escape-символа не является символом-шаблоном, то escape-символ игнорируется, а следующий символ рассматривается как обычный символ в шаблоне. К этим символам-шаблонам относятся: подчеркивание (_), процент (%) и левая квадратная скобка ([), в том случае, если они заключены в квадратные скобки. Escape-символы могут использоваться в квадратных скобках ([ ]), включая: знак вставки (^), дефис (-) и правую квадратную скобку (]).
0x0000 (char(0)) является неопределенным символом в параметрах сортировки Windows и не может быть включен в LIKE.
Примеры
А. Использование LIKE с диким символом % карта
В следующем примере в таблице 415 выполняется поиск всех телефонных номеров с кодом города PersonPhone .
-- Uses AdventureWorks SELECT p.FirstName, p.LastName, ph.PhoneNumber FROM Person.PersonPhone AS ph INNER JOIN Person.Person AS p ON ph.BusinessEntityID = p.BusinessEntityID WHERE ph.PhoneNumber LIKE '415%' ORDER BY p.LastName; GO
FirstName LastName Phone ----------------- ------------------- ------------ Ruben Alonso 415-555-124 Shelby Cook 415-555-0121 Karen Hu 415-555-0114 John Long 415-555-0147 David Long 415-555-0123 Gilbert Ma 415-555-0138 Meredith Moreno 415-555-0131 Alexandra Nelson 415-555-0174 Taylor Patterson 415-555-0170 Gabrielle Russell 415-555-0197 Dalton Simmons 415-555-0115 (11 row(s) affected)
B. Использование NOT LIKE с диким символом % карта
В следующем примере в таблице PersonPhone выполняется поиск всех телефонных номеров с региональным кодом, отличным от 415 .
-- Uses AdventureWorks SELECT p.FirstName, p.LastName, ph.PhoneNumber FROM Person.PersonPhone AS ph INNER JOIN Person.Person AS p ON ph.BusinessEntityID = p.BusinessEntityID WHERE ph.PhoneNumber NOT LIKE '415%' AND p.FirstName = 'Gail' ORDER BY p.LastName; GO
FirstName LastName Phone ---------------------- -------------------- ------------------- Gail Alexander 1 (11) 500 555-0120 Gail Butler 1 (11) 500 555-0191 Gail Erickson 834-555-0132 Gail Erickson 849-555-0139 Gail Griffin 450-555-0171 Gail Moore 155-555-0169 Gail Russell 334-555-0170 Gail Westover 305-555-0100 (8 row(s) affected)
C. Использование предложения ESCAPE
В следующем примере предложение ESCAPE и escape-символ используются для поиска символьной строки 10-15% в столбце c1 таблицы mytbl2 .
USE tempdb; GO IF EXISTS ( SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'mytbl2' ) DROP TABLE mytbl2; GO USE tempdb; GO CREATE TABLE mytbl2 (c1 SYSNAME); GO INSERT mytbl2 VALUES ('Discount is 10-15% off'), ('Discount is .10-.15 off'); GO SELECT c1 FROM mytbl2 WHERE c1 LIKE '%10-15!% off%' ESCAPE '!'; GO
D. Используйте дикие [ ] карта символы
В следующем примере выполняется поиск в таблице Person сотрудников с именем Cheryl или Sheryl .
-- Uses AdventureWorks SELECT BusinessEntityID, FirstName, LastName FROM Person.Person WHERE FirstName LIKE '[CS]heryl'; GO
В следующем примере выполняется поиск строк в таблице Person для сотрудников с фамилией Zheng или Zhang .
-- Uses AdventureWorks SELECT LastName, FirstName FROM Person.Person WHERE LastName LIKE 'Zh[ae]ng' ORDER BY LastName ASC, FirstName ASC; GO
Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)
Д. Использование LIKE с диким символом % карта
В следующем примере в таблице DimEmployee выполняется поиск всех сотрудников, телефонные номера которых начинаются с 612 .
-- Uses AdventureWorks SELECT FirstName, LastName, Phone FROM DimEmployee WHERE phone LIKE '612%' ORDER BY LastName;
F. Использование NOT LIKE с диким символом % карта
В следующем примере в таблице DimEmployee выполняется поиск всех телефонных номеров, которые не начинаются с 612 .
-- Uses AdventureWorks SELECT FirstName, LastName, Phone FROM DimEmployee WHERE phone NOT LIKE '612%' ORDER BY LastName;
G. Использование LIKE с диким символом _ карта
В следующем примере в таблице DimEmployee выполняется поиск всех телефонных номеров, начинающихся с 2 и заканчивающихся на 6 . Подстановочный знак «%» добавлен в конце шаблона поиска, что соответствует любым следующим символам в значениях столбца с телефонными номерами.
-- Uses AdventureWorks SELECT FirstName, LastName, Phone FROM DimEmployee WHERE phone LIKE '6_2%' ORDER BY LastName;
См. также
- PATINDEX (Transact-SQL)
- Выражения (Transact-SQL)
- Что такое функции базы данных SQL?
- SELECT (Transact-SQL)
- SELECT (Transact-SQL)
- WHERE (Transact-SQL)
Вывести имена людей которые заканчиваются на man
Мысли вслух лида аналитики ЛитРес, уроки по SQL/Python для новичков и не только, рассуждения о том, как делать надо и главное — как не надо, что должен уметь начинающий аналитик и чем дата-саентист отличается от дата-инженера
About
Blog
Apps
Platform
Налейте аналитику
1K subscribers

Вот пример реального запроса с BETWEEN. Обратите внимание, что ‘2021-07-22 00:00:00’ попадает в условие BETWEEN ‘2021-07-21’ AND ‘2021-07-22’. Если это не учитывать, то можно с легкостью посчитать лишнюю транзакцию или еще что-то, что не подразумевалось автором запроса.

Поэтому я бы запрос к задаче №10 сформировал такой:
FROM Trip AS t
WHERE t.time_out >=’1900-01-01 10:00′

Разбор задачи SQL №13
В прошлый раз разбиралась десятая задача. В этот раз начнем разбирать тринадцатую, в которой познакомимся c элементом запроса HAVING. На мой взгляд, это первая задача, которая требует чуточку сообразительности.

На самом деле, сообразительность нужна только для того, чтобы переформулировать постановку «Вывести имена людей, у которых есть полный тёзка среди пассажиров» в более понятную «Вывести name из таблицы Passenger, встречающиеся более 1 раза».
Для начала поймем, как построить запрос с группировкой по имени пассажиров (name) и кол-вом таких имен в таблице. Это не очень сложно:
FROM Passenger
GROUP BY name
ORDER BY COUNT(*) DESC

Видим, что имена всех пассажиров, кроме одного имени, встречаются по 1 разу. Собственно, именно это имя нам и нужно — осталось убрать из ответа всех остальных. Для этого нам как раз понадобится HAVING. HAVING — команда, аналогичная WHERE, но с той разницей, что WHERE идет в запросе до группировки и накладывает условия на поля в таблице, а HAVING идет после группировки GROUP BY и накладывает условия на результат этой группировки.

Так, если в запросе выше после GROUP BY добавить условие HAVING COUNT(*)>1, мы получим почти то, что нужно в задаче:
FROM Passenger
GROUP BY name
HAVING COUNT(*)>1

В целом, ответ правильный, с той лишь разницей, что формально по условию задачи в результате должно быть только одно поле name. А вот теперь все формальности тренажера учтены

Всем привет, совместно с Мариной с канала Продакт аналитикс — продуктовым аналитиком в AliExpress — подготовили небольшой разбор BI-систем: я имел значительный опыт работы с MS PowerBI, Марина — с Tableau. Бесспорно, это самые распространенные BI-инструменты, каждый из нас расскажет о своем.
➕ Гибкая ценовая политика. Есть лицензии Pro, которые стоят 10$ в месяц на пользователя. То есть, если в небольшой компании, скажем, 2 аналитика и 28 человек, которым нужен доступ на просмотр отчетов — то это выйдет в 300$ в месяц (250 тысяч рублей в год). Возможности в Pro-версии, конечно, порезаны, но многим с головой хватит и этого — обновление по расписанию есть, коннекторы к десяткам источников данных на месте. Premium-версия отличается возможностью развернуть PBI на своем сервере и выделенным сервером отчетов, что нужно для компаний со строгой политикой безопасности и работы с большими объемами данных
➕ Низкий порог вхождения в создание отчетов, буквально возможность создать отчет, не написав ни одной строчки кода. Да, в PBI есть свой язык формул — DAX и язык запросов Power Query (как и в Excel), но для несложных отчетов про это можно не вспоминать. После загрузки данных в PBI для работы с ними открывается визуальный интерфейс, очень сильно напоминающий Excel, в котором табличные данные легко обрабатываются, преобразуются, добавляются новые столбцы и вычисляются новые меры. Опять же, если приводить в качестве аналогии Excel, то это как записать макрос, только проще.
➕ Много разнообразных визуализаций — от столбчатых диаграмм до диаграмм Ганта и карты мира.
➕ Неплохая мобильная версия, в т.ч. приложения для IOS/Android. Как и в Tableau, посмотреть в дороге, не упала ли вчера выручка, очень подойдет.
➕ По единичному личному опыту — неплохая русскоязычная поддержка, вопрос был решен в течение 2 дней.
Минусы, конечно же, тоже есть.
➖ Отсутствие PowerBI Desktop — основного инструмента создания отчетов и подключения к данным — на Mac OS.
➖ Ограничения на объемы. Смешные для некоторых компаний ограничения на объемы в лицензии Pro — это еще ничего (1Гб размер отчета/файла .pbix, 10Гб размер одного источника данных), т.к. в Premium на порядки больше, подробнее здесь. А вот ограничение в 150 тысяч строк на экспорт из отчета в Excel/csv — это в 2021 году недопустимо. Конечно, прекрасно, что любой пользователь опубликованного отчета может скачать сырые данные таблиц/графиков себе в Excel/csv и работать с ними самостоятельно. Но 150 тысяч строк? Excel уже давно поддерживает 2 в степени 20 строк (если калькулятора под рукой нет, то это 1 048 576 строк), я писал об этом здесь. И этот объем лицензией Premium не увеличить.
➖ Отсутствие в лицензии Pro жизненно необходимых функций. Понятно, что MS стимулирует выбирать более дорогую лицензию — но, например, инкрементальное добавление данных есть только в премиуме, что уже совсем нехорошо.
➖ Подключение к локальным источникам через персональный шлюз работает не очень хорошо. Обновление в оперативной памяти компьютера, на котором установлен PowerBI Desktop при использовании персонального шлюза, ограничивает объем данных, которые может вместить PBI, а также загружает оперативку компьютера под 100%.
➖ Несмотря на обилие визуализаций, к ним иногда возникают вопросы. Во-первых, вырвиглазные цвета в стандартной цветовой схеме — ярко-красный, очень интенсивный цвет морской волны, обилие каких-то козявочных оттенков. Иногда, чтобы добиться приемлемого вида, если категорий много, сидишь только над цветами по полчаса. Во-вторых, например, сглаженная линия, которую в 2 клика можно сделать в Excel, тут недоступна, что делает многие графики неприятно ломаными.

➕ Действительно классно визуализирует данные, превращая их в крутые дашборды, являющиеся образцом качества и дизайна (чем могут похвастаться далеко не все визуализаторы)
➕ Достаточно легкий и интуитивно понятный в использовании
➕ Обладает высокой производительностью, потому что тянет даже очень big data
➕ Поддерживает мобильную версию (что крайне важно, если вы, например, делаете много дашбордов с KPI, а у ваших заказчиков возникла резкая потребность что-то проверить — можете быть уверены, качество на мобильной версии не поедет)
➕ Огромное сообщество пользователей Tableau -на 99,9% вопросов вы найдете ответы в различных видео на ютубе, stackoverflow, официальных видео на сайте инструмента и т.д.)
Теперь о минусах.
➖ Дорого и даже очень, поэтому подходит в большинстве своем для крупных компаний, которые могут себе это позволить
➖ Ценообразование негибкое, то есть, отсутствует индивидуальный подход к клиентам и всем из них предлагается расширенная лицензия, хотя она может быть не особо актуальна для компании
➖ Не самый безопасный инструмент — не обеспечивает 100% защиту данных
➖ Фактическое отсутствие постпродажного обслуживания — в вашу проблему навряд ли будут вникать, скорее, просто предложат докупить какой-то пакет, и на сим поддержка закончится
➖ Вечные проблемы с версиями — что-то будет доступно в старой версии, а что-то — уже нет
➖ Несмотря на опцию постановки каких-то отчетов на расписание, тем не менее что-то придется перепинывать вручную, что не всегда удобно
➖ Чтобы сделать какие-то элементы, которые часто нужны в дашбордах, вам часто может понадобиться использование различных костылей с копированием элементов из Гугла, хитровыдуманных функций и просмотров видео с коллегами из Индии

Разбор задачи SQL №16 (с ошибкой)
Задача номер 16. Вывести отсортированный по количеству перелетов (по убыванию) и имени (по возрастанию) список пассажиров, совершивших хотя бы 1 полет.
В этой задачке тренажер обхитрил сам себя ) сейчас все расскажу

Как уже было упомянуто, задачка интересна тем, что в ней есть ошибка в онлайн-тренажере. Для начала — как бы я решал эту задачу. Запрос несложный, но. неправильный!

COUNT(DISTINCT pit.trip) AS count
FROM Pass_in_trip AS pit
JOIN Passenger AS p ON p.id = pit.passenger
ORDER BY count DESC, p.name ASC

В разборе задачи №5 я писал, что COUNT(DISTINCT id) лучше, чем COUNT(*), т.к. помогает в том числе избежать дублей при джоинах. В текущей задаче дублей при джойнах не наблюдается, но все равно пример показательный. Видим, что для пассажира ‘Michael Caine’ COUNT(DISTINCT trip) дал результат 3, а COUNT(*) = 4.
1.9K views edited 11:42

Лезем дальше в таблицы. Пропускаю этап, где я определил, что id этого пассажира Passenger.id = 14, и что мы видим по нему в таблице Pass_in_trip? Видим, что на одном рейсе 7771 он купил 2 места! Поэтому COUNT(DISTINCT trip) = 3, а COUNT(*) = 4.
2.1K views edited 11:44

Я абсолютно уверен, что тренажер, подсунув эту задачку с небольшой хитростью, обманул сам себя. Пассажир совершил 3 полета, но чтобы получить выполнение задания, нужно в запросе поставить COUNT(*), который вернет для этого пассажира число 4. Ай-яй-яй, тренажер!

Что интересно видеть в данном канале?
Anonymous Poll
Разбор задач SQL
Работа в питоне (начальный уровень)
Работа в питоне (продвинутый уровень)
Разбор реальных (или приближенных) аналитических задач
Абстрактные размышления об аналитике (пример — пост о типах аналитиков)
Мемы об аналитике
Всего понемногу
Свой вариант (в комментах)
432 voters 2.3K views 14:46

Налейте аналитику pinned « #дайджест В последнее время все посты выходили по теме разбора простеньких задач из тренажера SQL (уже скоро начнутся задачи поинтереснее), поэтому предыдущие посты немного затерялись, возможно, часть аудитории о них и не знает ) Поэтому небольшой дайджест… »

Друзья, всем привет ) Давно не было постов на канале по одной простой причине — как ни странно, сейчас банально не хватает времени и оперативки в голове, чтобы уделять время каналу. С сентября я ушел из ЛитРеса, в котором провел почти 6 лет (буду впоминать это время с теплотой), и перешел в другой проект, в рамках которого в скором времени релоцируюсь на Кипр.
Новая компания = новые задачи + терабайты новой информации. По мере того, как в голове будет освобождаться место под что-то еще, регулярность постов будет стабилизироваться.
В связи с последними событиями в жизни, пост будет посвящен советам, как проще адаптироваться на новом месте работы.
1. Морально подготовьтесь к началу работы на новом месте. Моей стратегической ошибкой было то, что между последним днем в ЛитРесе и началом работы в новой компании прошло 2 дня. По возможности, не делайте так, возьмите перерыв хотя бы в неделю. Потому что первые недели (а то и месяцы) на новом месте потребуют куда более интенсивной работы мозга и памяти, чем впоследствии. «Как зовут людей вокруг? Кто чем занимается? Чем я должен заниматься? Где почитать про структуру БД? Как устроен такой-то процесс?» — вопросов будет миллион, а ответы на эти вопросы надо будет запоминать. С другой стороны, отдыхать 3 месяца тоже не стоит: все мы помним еще со школьной парты, как стираются за лето все знания предыдущего года. Оптимальный срок — 1-2 недели, как будто настал очередной отпуск.
2. Не стесняйтесь задавать вопросы всем подряд. Если вы задаете много вопросов — это не значит, что вы туго соображаете. Это значит, что вы хотите во всем разобраться. Даже если вам кажется, что ваши вопросы покажутся глупыми — это вообще никак не должно вас смущать. Лучше задать глупый вопрос, получить на него ответ и навсегда для себя этот вопрос закрыть, чем умолчать, но впоследствии сделать ошибку. Временно забудьте пословицу «Промолчишь — за умного сойдешь». Обычно в мире взрослых воспитанных индивидов люди рады помогать новичкам. Конечно, везде есть грань, почувствовать которую поможет эмоциональный интеллект и здравый смысл, но поверьте, перейти эту грань довольно сложно.
3. Фиксируйте знания. Вы точно забудете 80% информации, полученной устно. Информации поначалу так много, что в голове все уместить нереально. Поэтому конспектируйте, записывайте в блокнот, записывайте видеовстречи. Если вам кто-то что-то объясняет, начинайте встречу с фразы «Я буду тезисно конспектировать, если что, попрошу помедленее». Это поможет вам не задавать одни и те же вопросы.
4. Не вы*бывайтесь. У вас за плечами докторская диссертация, 73 года опыта в похожей сфере и трехзначный IQ — в бизнесе и процессах той компании, куда вы пришли, вы все равно разбираетесь хуже своих новых коллег. Со временем вы органическим образом наберете «вес» и авторитет в компании, если вы действительно хороший специалист. Навсегда стоит забыть фразы «Я в этом разбираюсь лучше», «Вы это так считаете? Какой ужас, все неправильно», «Никто уже давно это не использует, удивлен, что у вас до сих пор Windows Vista», «А у нас вот было вот так вот в сто раз лучше».
5. Уточните максимально четко круг своих обязанностей. Не сделать то, что от вас ждали и делать много «чужой» работы — одинаково плохо. Вы должны как можно четче понимать и дать понять другим, с какими вопросами стоит обращаться к вам, а с какими — не к вам. Хороший руководитель старается этот круг более-менее четко очертить для своих подчиненных, но иногда приходится чертить самому. Главное, как и всегда, не забывать про вежливость.
3.1K views edited 16:19

Про АБ-тесты
Для многих аналитиков анализ АБ-тестов занимает значительную часть рабочей деятельности. Для проформы. АБ-тестирование — метод исследования, при котором показатели одной или нескольких тестовых групп, в которых присутсвуют изменения, сравниваются с показателями контрольной группы, в которую изменения не вносились.
Например, есть страница сайта по аренде недвижимости. Заходя на сайт, пользователи видят строку поиска по адресу/городу/району. Может быть, будет лучше, если пользователей будет встречать карта местности? Для ответов на такие вопросы проводят АБ-тесты. Под тест выделяют определенный процент аудитории (скажем, 10% всех заходящих на сайт пользователей), который разбивают поровну между контрольной и тестовой группой. Контрольная группа, заходя на сайт, видит строку с поиском. Тестовая группа видит карту с отмеченными объектами недвижимости.
Что происходит в отделе аналитики? Выбирается показатель — в данном случае уместно, допустим, рассмотреть конверсию из посещения сайта в заявку — и анализируется, насколько он различается в контрольной и тестовой группе. Вообще, показатели могут быть разные. Могут быть временные ряды, могут быть накопительные/ненакопительные значения показателей на пользователя, но подход к анализу примерно одинаков.
1. Расчет необходимого кол-ва посетителей в группах. На самом деле, нарушая хронологический порядок событий в посте, этот этап нужно делать перед запуском теста. Он необходим для того, чтобы избежать так называемой проблемы подглядывания, когда при недостаточном наборе можно ошибочно принять различия между группами за значимые, хотя значимость на самом деле «мигает» от наблюдения к наблюдению. Если набор рассчитан заранее, то нужно единожды посчитать значимость тогда, когда кол-во пользователей в группах достигло заданного значения, а после этого набралось достаточно значений для расчета. Не углубляясь в математику, расчет необходимого кол-ва участников теста можно произвести в одном из онлайн-калькуляторов, например, вот этом.
2. Определение статистической значимости различий. Необходимое кол-во пользователей в тест набрано, тест шел 2 недели, допустим, у нас есть почасовые данные по конверсиям из посещения в заявку, всего 336 значений конверсий в каждой группе. Далее применяя статистические критерии, можно определить, случайные или нет различия в выбранном показателе между группами. Данный пост скорее ознакомительный и направлен на то, чтобы обрисовать общую логику без погружения в математику, но немного статистики тут все равно понадобится, потому что возникает вопрос: а как считать?
2.1. Если показатель имеет нормальное распределение, применяем t-тест Стьюдента, рассчитываем p-value (можно интерепретировать как вероятность того, что наблюдаемые нами различия случайны). Если p-value оказывается меньше уровня значимости (общепринято 0,05), делаем вывод о том, что различия между группами статистически значимы. Тут стоит, конечно, отметить, что нормальность распределения самого показателя — необязательное требование. Нормальными (согласно ЦПТ) должны быть распределены выборочные средние из наших данных. Но сейчас пока обойдемся такой вот грубой классификацией
2.2. Если распределение показателя не является нормальным, то тут можно:
а) не анализировать ряд, а свести все к анализу четырехпольных таблиц с помощью критерия Хи-квадрат. Из 10 000 пользователей в группе А конверсию совершили 500 человек, а из 10 500 пользователей в группе Б — 550 человек. Судя по вот таком калькулятору, такие различия не являютя значимыми.
б) использовать bootstrap
в) использовать непараметрические критерии, один из самых распространенных — критерий Манна-Уитни.
Если хотите углубиться подробнее в суть и реализацию t-теста, bootstrap и Манна-Уитни, советую посмотреть вебинар от Анатолия Карпова, ни убавить ни прибавить, там все отлично расписано )
Как вывести имена всех людей, которые покупали морские продукты? Пример на SQL тренажере
Пытаюсь разобраться в sql с помощью задачек на этом онлайн-тренажере https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all
Исходя из базы на этом сайте есть задание:
Вывести только имена всех людей, которые покупали морские продукты
Насколько я поняла, для этого надо связать друг с другом 4 таблицы. Структура
Customers: CustomerID, CustomerName
Orders: OrderID, CustomerID
OrderDetails: OrderID, ProductID
Products: ProductID, CategoryID У меня получилась данная каша, в верности результата не уверена:
SELECT CustomerName FROM Customers where CustomerID in (SELECT CustomerID FROM Orders where OrderID in (SELECT OrderID FROM OrderDetails where ProductID in (SELECT ProductID FROM Products where CategoryID=8 )))
Подскажите, как можно решить данный пример?
Отслеживать
задан 9 авг 2021 в 12:49
1 1 1 бронзовый знак
WHERE IN — это не только каша, но ещё и весьма качественные тормоза. Прочитайте ещё раз мануалы по JOIN, да повнимательнее. И прекратите мыслить итерациями — небось, не Бэйсик. В SQL мыслят так — сперва взять всё, потом отбросить ненужное. Т.е. множествами.
9 авг 2021 в 13:26
PS. Вывести только имена всех людей — это зачёт!
9 авг 2021 в 13:27
@Akina, после слова «всех» идет уточнение «которые . »
9 авг 2021 в 13:28
@MaxU Вот именно поэтому здесь и не должно быть слова «всех». Либо наоборот, не должно быть слова «только». Масло масляное — это бред, но и масло немасляное — бред не меньший.
Помогите пож-та написать запрос: Вывести имена людей, которые заканчиваются на «man»

Мы постоянно добавляем новый функционал в основной интерфейс проекта. К сожалению, старые браузеры не в состоянии качественно работать с современными программными продуктами. Для корректной работы используйте последние версии браузеров Chrome, Mozilla Firefox, Opera, Microsoft Edge или установите браузер Atom.