🔥 Как извлекать данные из JSON в PostgreSQL?
💡 Сразу обозначим примерный
🔹 Оператор
🔹 Оператор
🔹 Извлечение элементов массива
Если JSON-документ имеет сложную структуру с вложенными объектами, можно использовать путь для указания конкретного поля:
💡 Знание и использование операторов
P.S. Если вы хотите попробовать самостоятельно запросы из поста, вам понадобится предварительно создать табличку с JSON-файлом. Вы можете сделать это так:
JSON стал популярным форматом данных благодаря своей гибкости и простоте использования. И если вы используете PostgreSQL, то у вас есть доступ ко множеству функций и операторов для работы с JSON- документами. Давайте сегодня разберемся, как извлечь значения полей из JSON с помощью различных операторов.💡 Сразу обозначим примерный
JSON, с которым будем работать:{
"name": "Ivan Ivanov",
"age": 25,
"person": {
"address": {
"city": "Moscow",
"street": "Pushkina str"
},
"phone": "+7 904 111 22 33"
},
"items": [
{
"name": "Item 1",
"price": 1000
},
{
"name": "Item 2",
"price": 1500
},
{
"name": "Item 3",
"price": 2000
}
]
}
Итак, приступим к разбору!🔹 Оператор
->
Оператор -> позволяет получать значение определенного поля из JSON-документа по ключу. Для этого необходимо указать путь к нужному полю. Рассмотрим пример:SELECT json_data -> 'name'
AS name
FROM my_table;
Здесь мы извлекаем значение поля name из JSON-документа. Результатом будет столбец name с извлеченными значениями, в нашем случае "Ivan Ivanov" (кавычки так же сохранятся).🔹 Оператор
->>
Оператор ->> используется для извлечения значения поля в типе text. В отличие от оператора ->, который возвращает значение в формате JSON. Например, получим текстовое значение поля age:SELECT json_data ->> 'age'
AS age
FROM my_table;
Или, аналогично прошлому примеру, можем использовать оператор ->>, чтобы получить результат в текстовом формате.🔹 Извлечение элементов массива
JSON также позволяет хранить данные в виде массивов. Используя операторы -> и ->>, мы можем извлекать значения элементов массива по индексу. Извлечем первый элемент из массива items:SELECT json_data-> 'items'-> 0
AS first_item
FROM my_table;
🔹 Использование пути для извлечения данныхЕсли JSON-документ имеет сложную структуру с вложенными объектами, можно использовать путь для указания конкретного поля:
SELECT json_data -> 'person' ->
'address' ->> 'city' AS city
FROM my_table;
В этом примере мы извлекаем значение поля city, находящегося во вложенном объекте address, который в свою очередь находится в объекте person.💡 Знание и использование операторов
-> и ->> для извлечения данных из JSON в PostgreSQL дает широкие возможности для работы с гибкими иерархическими структурами данных. Это помогает извлекать нужные значения и использовать их в запросах. P.S. Если вы хотите попробовать самостоятельно запросы из поста, вам понадобится предварительно создать табличку с JSON-файлом. Вы можете сделать это так:
CREATE TABLE my_table (
id serial NOT NULL PRIMARY KEY,
json_data json NOT NULL
);
INSERT INTO my_table (json_data)
VALUES('здесь ваш JSON-файл');
#sql🔥18👍6
🔥 Полезная команда для анализа данных!
Сегодня хотим обсудить с вами удивительную тему в PostgreSQL, которая поможет вам ускорить и улучшить свои аналитические запросы - материализованные представления (
🟢 Что такое материализованные представления?
Это специальный тип представлений (
Материализованные вьюшки находится между обычным
Это основное отличие от простого
👉🏼 Теперь представим, что у вас есть сложный запрос, который часто выполняется для получения отчетов или анализа данных. Использование материализованных представлений может значительно ускорить процесс выполнения запроса и уменьшить нагрузку на базу данных.
1️⃣ Во-первых, это ускорит запросы: Поскольку данные уже предварительно вычислены и сохранены в таблице, выполнение запросов становится намного быстрее.
2️⃣ Во-вторых, снизит нагрузки на базу данных: Представления обновляются только по мере необходимости, что позволяет снизить количество обращений к базовым таблицам и оптимизировать работу с данными.
3️⃣ В третьих, их просто легко использовать: Материализованные представления могут быть использованы так же, как и обычные таблицы, что делает их удобными и гибкими для аналитических запросов.
🔵 Как создать материализованное представление:
Для создания материализованного представления вам потребуется выполнить следующие шаги:
1️⃣ Написать запрос, который будет формировать данные для представления.
2️⃣ Создать материализованное представление с помощью команды CREATE MATERIALIZED VIEW.
3️⃣ Определить опции материализованного представления (столбцы, условия фильтрации и сортировки данных, а также права доступа для пользователей или ролей).
4️⃣ Указать опцию REFRESH MATERIALIZED VIEW для обновления данных представления по мере необходимости. Вы можете настроить автоматическое обновление представления или выполнять его вручную.
🎯 Пример
Предположим, у вас есть базовая таблица
💥 В нашем Симуляторе «Аналитик данных» мы раскрываем еще больше возможностей SQL, Python и других инструментов аналитика!
#sql
Сегодня хотим обсудить с вами удивительную тему в PostgreSQL, которая поможет вам ускорить и улучшить свои аналитические запросы - материализованные представления (
Materialized Views).🟢 Что такое материализованные представления?
Это специальный тип представлений (
view) в PostgreSQL, которые сохраняют результаты выполнения запроса как физическую таблицу в базе данных. При этом данные материализованного представления обновляются только по мере необходимости, когда базовые таблицы изменяются.Материализованные вьюшки находится между обычным
view и таблицей. По сути, они строятся на основе запроса, ссылающегося на одну или несколько таблиц, и результаты хранятся физически, что делает их похожими на кэш.Это основное отличие от простого
view, которое обращается к источнику каждый раз, когда вы его вызываете. То есть, прежде, чем получить результат, вам придется немного подождать.👉🏼 Теперь представим, что у вас есть сложный запрос, который часто выполняется для получения отчетов или анализа данных. Использование материализованных представлений может значительно ускорить процесс выполнения запроса и уменьшить нагрузку на базу данных.
1️⃣ Во-первых, это ускорит запросы: Поскольку данные уже предварительно вычислены и сохранены в таблице, выполнение запросов становится намного быстрее.
2️⃣ Во-вторых, снизит нагрузки на базу данных: Представления обновляются только по мере необходимости, что позволяет снизить количество обращений к базовым таблицам и оптимизировать работу с данными.
3️⃣ В третьих, их просто легко использовать: Материализованные представления могут быть использованы так же, как и обычные таблицы, что делает их удобными и гибкими для аналитических запросов.
🔵 Как создать материализованное представление:
Для создания материализованного представления вам потребуется выполнить следующие шаги:
1️⃣ Написать запрос, который будет формировать данные для представления.
2️⃣ Создать материализованное представление с помощью команды CREATE MATERIALIZED VIEW.
3️⃣ Определить опции материализованного представления (столбцы, условия фильтрации и сортировки данных, а также права доступа для пользователей или ролей).
4️⃣ Указать опцию REFRESH MATERIALIZED VIEW для обновления данных представления по мере необходимости. Вы можете настроить автоматическое обновление представления или выполнять его вручную.
🎯 Пример
Предположим, у вас есть базовая таблица
sales_data, содержащая информацию о продажах, и вы хотите создать материализованное представление, которое будет содержать сумму продаж по каждому месяцу.-- Создание материализованного представления🔎 Использование материализованных представлений в
CREATE MATERIALIZED VIEW
monthly_sales AS
SELECT DATE_TRUNC('month',
order_date) AS month,
SUM(sales_amount) AS
total_sales
FROM sales_data
GROUP BY month;
-- Обновление данных в представлении
REFRESH MATERIALIZED VIEW monthly_sales;
PostgreSQL - это мощный инструмент для оптимизации аналитических запросов и повышения производительности вашей базы данных. Попробуйте применить эту фишку в своих проектах и убедитесь как улучшится скорость выполнения запросов и облегчится ваша ежедневная рутина! 📈💥 В нашем Симуляторе «Аналитик данных» мы раскрываем еще больше возможностей SQL, Python и других инструментов аналитика!
#sql
👍10🔥6❤3
🔥 Pandas vs SQL
Мы уже написали множество постов для тех, кто работает с
💡По большому счету, можно сказать, что и
🔎 В карточках под постом мы представили некоторые операции в Pandas и их соответствующие аналоги в SQL 👇
🚀 Владение обоими инструментами поможет вам работать с данными более эффективно и с легкостью решать задачи анализа. Будь то
#sql #pandas
Мы уже написали множество постов для тех, кто работает с
Pandas, еще больше для тех, кто работает с SQL. А что, если среди нас все еще остались те, кто пользуется только одним из этих инструментов? 🤔💡По большому счету, можно сказать, что и
Pandas, и SQL, позволяют нам манипулировать данными. Кто-то делает это быстрее, кто-то медленнее - везде свои преимущества. Но если вдруг вы, эксперты в Pandas, и до сих пор не работаете с SQL, или профессионально работаете с SQL, но вам так и не поддается Pandas - этот пост для вас!🔎 В карточках под постом мы представили некоторые операции в Pandas и их соответствующие аналоги в SQL 👇
🚀 Владение обоими инструментами поможет вам работать с данными более эффективно и с легкостью решать задачи анализа. Будь то
Pandas или SQL, оба этих инструмента предоставляют множество возможностей для манипуляции данными. Выберите тот, который подходит вам больше, или, что еще лучше, освоите оба!#sql #pandas
🔥9👍5
🔥 Когда пригодится SELF JOIN?
Как часто вы используете соединение таблицы с самой собой? Это не часто встречающаяся практика. Но на самом деле
1️⃣ Поиск пробелов
Имеется таблица
Иногда необходимо найти места, так называемых пробелов в значениях. В нашем случае - число, с которого этот разрыв начинается. Например, у нас есть строки:
2️⃣ Поиск дублирующихся строк
Допустим, таблица
Для поиска дублирующихся строк на основе конкретного столбца, например
3️⃣ Ранжирование
Имеем таблицу
Чтобы назначить определенное место каждому спортсмену мы снова соединим таблицу саму с собой.
💥 Есть еще множество необычных вещей, на которые способен
#sql
Как часто вы используете соединение таблицы с самой собой? Это не часто встречающаяся практика. Но на самом деле
self join помогает решить удивительно большой список задач. Давайте посмотрим!1️⃣ Поиск пробелов
Имеется таблица
foo (см. Карточку 1)Иногда необходимо найти места, так называемых пробелов в значениях. В нашем случае - число, с которого этот разрыв начинается. Например, у нас есть строки:
1, 4, 9 - разрывы здесь это 2-3, 5-8. И нам нужно получить первое число каждого разрыва, то есть 2 и 5. И для этого мы можем соединить таблицу саму с собой.2️⃣ Поиск дублирующихся строк
Допустим, таблица
foo теперь содержит имена, фамилии и почту клиентов. (см. Карточку 2)Для поиска дублирующихся строк на основе конкретного столбца, например
email, можно использовать тот же подход:3️⃣ Ранжирование
Имеем таблицу
player. (см. Карточку 3)Чтобы назначить определенное место каждому спортсмену мы снова соединим таблицу саму с собой.
💥 Есть еще множество необычных вещей, на которые способен
self join, о которых мы вам еще расскажем. Но сначала поделитесь, приходилось ли вам использовать подобные конструкции в своей работе? Может быть у вас есть свои лайфхаки? Пишите в комментариях!#sql
🔥10👍4❤1
📚 Секреты с SQL собеседований: Изучаем констраинты в PostgreSQL!
Привет, друзья! Сегодня мы углубимся в мир
⭐️ Что такое констраинты в PostgreSQL?
Констраинты – это правила или ограничения, которые налагаются на данные в таблицах базы данных. Они гарантируют соблюдение определенных правил при вставке или изменении данных, помогая избежать ошибок и несогласованных значений.
🔍 Типы констраинтов
1. PRIMARY KEY (
2. FOREIGN KEY (
3. UNIQUE (
4. CHECK (проверка): Устанавливает условие, которое должно быть истинным для вставки или обновления данных в таблице.
Пример:
Вопросы о констраинтах часто задают на собеседованиях, чтобы убедиться, что вы хорошо разбираетесь в работе с БД и понимаете, как обеспечить целостность данных. И хотя аналитикам редко приходится формировать таблицы - это спрашивают практически на каждом собеседовании. А предупрежден - значит вооружен!
👉 Подготовиться к любому техническому собеседованию поможет Симулятор собеседования аналитика → задачи с собеседований в топовые компании, тестовые онлайн-собеседования, вопросы и кейсы и много другое!
#sql #interview_problems
Привет, друзья! Сегодня мы углубимся в мир
SQL и обсудим одну из важных тем – констраинты! Если вы готовитесь к собеседованию на должность, связанную с SQL, то обязательно стоит освоить эту тему. Констраинты в PostgreSQL помогают обеспечивать целостность данных и поддерживать ограничения, защищающие информацию.⭐️ Что такое констраинты в PostgreSQL?
Констраинты – это правила или ограничения, которые налагаются на данные в таблицах базы данных. Они гарантируют соблюдение определенных правил при вставке или изменении данных, помогая избежать ошибок и несогласованных значений.
🔍 Типы констраинтов
1. PRIMARY KEY (
первичный ключ): Обеспечивает уникальность значений в столбце и предотвращает ввод значения NULL.CREATE TABLE products (
product_no integer PRIMARY KEY,
name text,
price numeric
);
2. FOREIGN KEY (
внешний ключ): Связывает значения в столбце с значениями в другой таблице, обеспечивая ссылочную целостность данных.-- например создадим внешний ключ к прошлой таблице в таблице orders
CREATE TABLE orders (
order_id integer PRIMARY KEY,
product_no integer REFERENCES
products (product_no),
quantity integer
);
3. UNIQUE (
уникальный): Гарантирует уникальность значений в столбце. Причем, в отличие от PRIMARY KEY - не гарантирует отсутствие NULL-значений. Так как два NULL значения для PostgreSQL - различны 🙂CREATE TABLE products (
product_no integer UNIQUE,
name text,
price numeric
);
-- или для группы столбцов сразу
CREATE TABLE example (
a integer,
b integer,
c integer,
UNIQUE (a, c)
);
-- причем в таком формате,
уникальными должны быть только
сочетания этих столбцов, а
значения по отдельности
уникальными могут и не быть :)
4. CHECK (проверка): Устанавливает условие, которое должно быть истинным для вставки или обновления данных в таблице.
Пример:
CREATE TABLE products (🚀 Почему это важно для собеседований?
product_no integer,
name text,
price numeric CHECK (price > 0)
);
-- ограничили цену товара положительными значениями
Вопросы о констраинтах часто задают на собеседованиях, чтобы убедиться, что вы хорошо разбираетесь в работе с БД и понимаете, как обеспечить целостность данных. И хотя аналитикам редко приходится формировать таблицы - это спрашивают практически на каждом собеседовании. А предупрежден - значит вооружен!
👉 Подготовиться к любому техническому собеседованию поможет Симулятор собеседования аналитика → задачи с собеседований в топовые компании, тестовые онлайн-собеседования, вопросы и кейсы и много другое!
#sql #interview_problems
❤11👍7🔥7
🔥 Ошибки при использовании джоинов 🔥
Давайте обсудим некоторые ключевые аспекты работы с джоинами в SQL, на которые стоит обратить внимание, чтобы избежать ошибок и недоразумений.
🔑 Сохранение данных в приоритете
При написании запросов с джоинами, особенно с транзитивными связями, всегда задавайте себе вопрос:
❓Какие данные мне важно не потерять?
Выбор правильного типа джоина имеет огромное значение, потому что неверный выбор может привести к некорректным результатам. Часто бывает так:
1️⃣ Вы выбираете джоин, который кажется логичным.
2️⃣ Вы не замечаете потенциальных проблем.
Давайте рассмотрим этот момент на примере:
⁉️ Почему так произошло?
Что, если в таблице problem есть строки, в которых company_id = NULL? Тогда такие строки будут исключены из результата, ведь в таблице company поле id - первичный ключ и не содержит NULL.
❗️Чтобы избежать потери данных, всегда помните о выборе правильного типа джоина:
Помните об этом важном аспекте при работе с джоинами, чтобы получать точные и полные результаты!
🔗 Узнайте больше полезностей в Симуляторе 👉 «Аналитик данных» 👈
#sql
Давайте обсудим некоторые ключевые аспекты работы с джоинами в SQL, на которые стоит обратить внимание, чтобы избежать ошибок и недоразумений.
🔑 Сохранение данных в приоритете
При написании запросов с джоинами, особенно с транзитивными связями, всегда задавайте себе вопрос:
❓Какие данные мне важно не потерять?
Выбор правильного типа джоина имеет огромное значение, потому что неверный выбор может привести к некорректным результатам. Часто бывает так:
1️⃣ Вы выбираете джоин, который кажется логичным.
2️⃣ Вы не замечаете потенциальных проблем.
Давайте рассмотрим этот момент на примере:
SELECT *На первый взгляд, этот запрос кажется корректным, и результаты выглядят нормально. Однако, если внимательно проанализировать, вы увидите, что множество записей из таблицы problem просто исчезли 😱
FROM problem p
JOIN page p2
ON p.page_id = p2.id
JOIN company c
ON p.company_id = c.id
⁉️ Почему так произошло?
Что, если в таблице problem есть строки, в которых company_id = NULL? Тогда такие строки будут исключены из результата, ведь в таблице company поле id - первичный ключ и не содержит NULL.
❗️Чтобы избежать потери данных, всегда помните о выборе правильного типа джоина:
SELECT *Используя LEFT JOIN, вы сохраните все записи из problem и соответствующие им записи из company, где
FROM problem p
JOIN page p2
ON p.page_id = p2.id
LEFT JOIN company c
ON p.company_id = c.id
problem.company_id=NULL, будут иметь пустые значения.Помните об этом важном аспекте при работе с джоинами, чтобы получать точные и полные результаты!
🔗 Узнайте больше полезностей в Симуляторе 👉 «Аналитик данных» 👈
#sql
❤17🔥9👍7🤩4
📋 Шпаргалка для создания таблиц и баз данных в PostgreSQL
1. Проверить наличие таблицы (если она существует, то удалить ее):
Это простой пример. Помимо указанных команд, вы также можете добавить ограничения (например,
А вот и примеры того, как создать в PostgreSQL ограничения
1. Создание PRIMARY KEY:
В этом примере
Вы можете повторять операторы
#sql
_ _ _ _ _ _ _ _ _
🔥 Хотите посмотреть, как устроен наш Симулятор «Аналитик данных» и понять, как вы можете бустануть свою карьеру в аналитике с помощью обучения на реальных бизнес-кейсах?
🔗 Просто запишитесь на нашу бесплатную онлайн-экскурсию: https://forms.gle/qSyfrudojoZpodYaA
1. Проверить наличие таблицы (если она существует, то удалить ее):
DROP TABLE IF EXISTS table;
2. Создать новую таблицу:CREATE TABLE table (
col1 type1,
col2 type2,
...
);
3. Создать базу данных (если ее нет):CREATE DATABASE IF
NOT EXISTS database;
4. Выбрать базу данных:\c database;
5. После выполнения всех необходимых операций, завершите запрос 😊Это простой пример. Помимо указанных команд, вы также можете добавить ограничения (например,
PRIMARY KEY, FOREIGN KEY) и индексы в вашей таблице, в зависимости от ваших потребностей.А вот и примеры того, как создать в PostgreSQL ограничения
PRIMARY KEY и FOREIGN KEY:1. Создание PRIMARY KEY:
CREATE TABLE user (
id SERIAL PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100) UNIQUE
);
2. Создание FOREIGN KEY:CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
user_id INT,
sales DECIMAL,
FOREIGN KEY (user_id)
REFERENCES user (id)
);
Для наполнения таблицы данными в PostgreSQL используется оператор INSERT INTO. Вот пример того, как можно вставить данные в созданную ранее таблицу:-- Вставка одной записи
INSERT INTO table (col1, col2)
VALUES ('val1', 'val2');
-- Вставка нескольких записей одновременно
INSERT INTO table (col1, col2)
VALUES ('val3', 'val4'),
('val5', 'val6');В этом примере
table - это имя вашей таблицы, col1, col2, и т. д. - это названия столбцов, в которые вы хотите вставить данные, а val1, val2, и т. д. - это фактические данные, которые вы хотите добавить.Вы можете повторять операторы
INSERT INTO для вставки необходимого количества записей в вашу таблицу 😄#sql
_ _ _ _ _ _ _ _ _
🔥 Хотите посмотреть, как устроен наш Симулятор «Аналитик данных» и понять, как вы можете бустануть свою карьеру в аналитике с помощью обучения на реальных бизнес-кейсах?
🔗 Просто запишитесь на нашу бесплатную онлайн-экскурсию: https://forms.gle/qSyfrudojoZpodYaA
👍8🔥8❤4🤩1
🔍 Пример ошибочно решенной задачи
Допустим, у нас есть таблица с заказами в интернет-магазине, и мы хотим найти среднюю цену заказа.
🚫 Ошибочное решение:
👉 Правильное решение:
Чтобы получить среднюю цену заказа, нам нужно учитывать не только столбец
📌 Урок:
Ошибкой в первом запросе было игнорирование количества товаров в заказах, что привело к неверному результату. Важно всегда внимательно анализировать задачу и участвующие данные, чтобы выбрать правильный способ решения.
#sql
Допустим, у нас есть таблица с заказами в интернет-магазине, и мы хотим найти среднюю цену заказа.
🚫 Ошибочное решение:
SELECT AVG(цена)Ошибка в этом запросе заключается в том, что мы пытаемся вычислить среднюю цену заказа путем применения
FROM заказы;
AVG() к столбцу цена, предполагая, что это сработает корректно.👉 Правильное решение:
Чтобы получить среднюю цену заказа, нам нужно учитывать не только столбец
цена, но и количество товаров в каждом заказе. Вот как правильно это сделать:SELECT SUM(цена*кол-во)/SUM(кол-во)В этой версии запроса мы умножаем цену на количество товаров в каждом заказе и затем делим сумму всех таких произведений на общее количество товаров. Это даст нам правильную среднюю цену заказа, учитывая количество товаров в каждом заказе.
FROM заказы;
📌 Урок:
Ошибкой в первом запросе было игнорирование количества товаров в заказах, что привело к неверному результату. Важно всегда внимательно анализировать задачу и участвующие данные, чтобы выбрать правильный способ решения.
#sql
🔥15👍6👎1
🔥 Разбор вопросов из актуального теста от компании Kaspersky 🚀
Недавно Касперский проводил входные тестирования на стажировку, и мы решили для вас эти тесты и сейчас поделимся разбором части вопросов.
А когда этот пост наберет 15 огоньков, разберем с вами продолжение этого теста.
Вопрос 1: Выберите запросы, которые не упадут с ошибкой.
1. Все вернут ошибку
2. SELECT ID, NAME, COUNT(*) FROM T1 GROUP BY ID, NAME;
3. SELECT COUNT(ID), * FROM T1 GROUP BY (ID);
4. SELECT COUNT(ID), * FROM T1 GROUP BY (ID) HAVING AGE>18;
5. SELECT * FROM T1 GROUP BY (COL1);
6. SELECT COUNT(ID) FROM T1 HAVING AGE>18;
✅ Ответы и объяснения:
1. SELECT ID, NAME, COUNT(*) FROM T1 GROUP BY ID, NAME; - Не вызовет ошибку.
Этот запрос выберет уникальные комбинации столбцов ID и NAME из таблицы T1, подсчитает количество строк в каждой комбинации и выведет результат.
2. SELECT COUNT(ID), * FROM T1 GROUP BY (ID); - Вызовет ошибку.
В операторе GROUP BY указан столбец ID, который используют для группировки результатов. Но когда используется агрегатная функция COUNT(ID), SQL ожидает, что также будут указаны, какие другие столбцы должны быть включены в результат, если они не являются частью агрегации.
3. SELECT COUNT(ID), * FROM T1 GROUP BY (ID) HAVING AGE>18; - Вызовет ошибку.
Аналогично предыдущему запросу.
4. SELECT * FROM T1 GROUP BY (COL1); - Вызовет ошибку.
При использовании оператора GROUP BY, обычно требуется агрегировать столбцы, которые не включены в часть выражения GROUP BY. В данном случае, используют оператор *, чтобы выбрать все столбцы, но не предоставляете агрегатную функцию для столбцов, не включенных в GROUP BY. Такой запрос будет считаться некорректным.
5. SELECT COUNT(ID) FROM T1 HAVING AGE>18; - Вызовет ошибку.
Ошибка связана с использованием оператора HAVING, который обычно используется для фильтрации результатов агрегатных функций, примененных к данным, сгруппированным с помощью оператора GROUP BY. Но в запросе отсутствует оператор GROUP BY, поэтому использование HAVING без GROUP BY будет рассматриваться как некорректное использование.
Вопрос 2: Какого типа данных не встретишь в SQL?
1. MEDIUMINT
2. SMALLINT
3. BIGINT
4. COMMENT
5. AUTO_INCREMENT
6. NULL
7. IDENTITY
8. TINYINT
9. DECIMAL
✅ Ответ:COMMENT, AUTO_INCREMENT, IDENTITY. Эти три опции не являются типами данных в SQL , а представляют собой различные атрибуты или свойства столбцов.
Вопрос 3: Вам необходимо очистить все содержимое таблицы. Каким запросом вы воспользуетесь?
Выберите один вариант из списка
1. DELETE FROM
2. TRUNCATE
3. DROP TABLE
4. TRUNCATE
5. DROP TABLE
Ответы и объяснения:
1. DELETE FROM my_schema.old_table WHERE NAME IS NULL;
Этот запрос удаляет строки из таблицы, удовлетворяющие условию "WHERE NAME IS NULL". Это не полная очистка таблицы.
2. TRUNCATE my_schema.old_table WHERE NAME IS NULL;
TRUNCATE TABLE не поддерживает использование WHERE для фильтрации строк, и данная комбинация вызовет ошибку.
3. DROP TABLE my_schema.old_table;
DROP TABLE удаляет всю таблицу, а не только её содержимое.
4. TRUNCATE my_schema.old_table;
Правильный вариант для очистки содержимого таблицы. Этот запрос удалит все строки из таблицы, но оставит саму таблицу в базе данных.
5. DROP TABLE my_schema.old_table WHERE NAME IS NULL;
DROP TABLE не поддерживает использование WHERE для фильтрации строк, и данная комбинация вызовет ошибку.
Итак, правильный запрос для очистки содержимого таблицы - TRUNCATE my_schema.old_table
💥 Мы стараемся максимально подготовить вас к собеседованиям и верим в вас! Не забудь нажать огонек, чтобы мы запостили продолжение.
#sql #Kaspersky #interview_problems
Недавно Касперский проводил входные тестирования на стажировку, и мы решили для вас эти тесты и сейчас поделимся разбором части вопросов.
А когда этот пост наберет 15 огоньков, разберем с вами продолжение этого теста.
Вопрос 1: Выберите запросы, которые не упадут с ошибкой.
1. Все вернут ошибку
2. SELECT ID, NAME, COUNT(*) FROM T1 GROUP BY ID, NAME;
3. SELECT COUNT(ID), * FROM T1 GROUP BY (ID);
4. SELECT COUNT(ID), * FROM T1 GROUP BY (ID) HAVING AGE>18;
5. SELECT * FROM T1 GROUP BY (COL1);
6. SELECT COUNT(ID) FROM T1 HAVING AGE>18;
✅ Ответы и объяснения:
Этот запрос выберет уникальные комбинации столбцов ID и NAME из таблицы T1, подсчитает количество строк в каждой комбинации и выведет результат.
2. SELECT COUNT(ID), * FROM T1 GROUP BY (ID); - Вызовет ошибку.
В операторе GROUP BY указан столбец ID, который используют для группировки результатов. Но когда используется агрегатная функция COUNT(ID),
3. SELECT COUNT(ID), * FROM T1 GROUP BY (ID) HAVING AGE>18; - Вызовет ошибку.
Аналогично предыдущему запросу.
4. SELECT * FROM T1 GROUP BY (COL1); - Вызовет ошибку.
При использовании оператора GROUP BY, обычно требуется агрегировать столбцы, которые не включены в часть выражения GROUP BY. В данном случае, используют оператор *, чтобы выбрать все столбцы, но не предоставляете агрегатную функцию для столбцов, не включенных в GROUP BY. Такой запрос будет считаться некорректным.
5. SELECT COUNT(ID) FROM T1 HAVING AGE>18; - Вызовет ошибку.
Ошибка связана с использованием оператора HAVING, который обычно используется для фильтрации результатов агрегатных функций, примененных к данным, сгруппированным с помощью оператора GROUP BY. Но в запросе отсутствует оператор GROUP BY, поэтому использование HAVING без GROUP BY будет рассматриваться как некорректное использование.
1. MEDIUMINT
2. SMALLINT
3. BIGINT
4. COMMENT
5. AUTO_INCREMENT
6. NULL
7. IDENTITY
8. TINYINT
9. DECIMAL
✅ Ответ:
Выберите один вариант из списка
1. DELETE FROM
my_schema.old_table WHERE NAME IS NULL;2. TRUNCATE
my_schema.old_table WHERE NAME IS NULL;3. DROP TABLE
my_schema.old_table;4. TRUNCATE
my_schema.old_table;5. DROP TABLE
my_schema.old_table WHERE NAME IS NULL;Ответы и объяснения:
Этот запрос удаляет строки из таблицы, удовлетворяющие условию "WHERE NAME IS NULL". Это не полная очистка таблицы.
2. TRUNCATE my_schema.old_table WHERE NAME IS NULL;
TRUNCATE TABLE не поддерживает использование WHERE для фильтрации строк, и данная комбинация вызовет ошибку.
3. DROP TABLE my_schema.old_table;
DROP TABLE удаляет всю таблицу, а не только её содержимое.
4. TRUNCATE my_schema.old_table;
Правильный вариант для очистки содержимого таблицы. Этот запрос удалит все строки из таблицы, но оставит саму таблицу в базе данных.
5. DROP TABLE my_schema.old_table WHERE NAME IS NULL;
DROP TABLE не поддерживает использование WHERE для фильтрации строк, и данная комбинация вызовет ошибку.
Итак, правильный запрос для очистки содержимого таблицы - TRUNCATE my_schema.old_table
#sql #Kaspersky #interview_problems
🔥62👍9❤4
📊🔍Разница между оконными и агрегатными функциями
Основное различие между оконными и агрегатными функциями заключается в том, КАК они обрабатывают данные:
Агрегатные функции сворачивают несколько строк в одну строку результата. Они выполняют операцию над набором строк, сгруппированных по определенным критериям, и возвращают единственное значение для каждой группы. Например, функции
Оконные функции, напротив, предоставляют результаты для каждой отдельной строки в наборе данных. Они выполняют агрегатную операцию над набором строк, но результат отображается как новое значение столбца в каждой строке. Оконные функции позволяют анализировать данные на уровне строк, не сворачивая их. Некоторые функции, такие как
Для наглядности, представьте себе задачу: вернуть название отдела и максимальную зарплату в каждом отделе.
Используем агрегатные функции:
Используем оконные функции:
Вопрос о разнице между оконными и агрегатными функциями часто встречается на собеседованиях. Уверены, теперь вы точно ответите на этот вопрос, если столкнетесь с ним 😎
#sql #interview_problems
Основное различие между оконными и агрегатными функциями заключается в том, КАК они обрабатывают данные:
Агрегатные функции сворачивают несколько строк в одну строку результата. Они выполняют операцию над набором строк, сгруппированных по определенным критериям, и возвращают единственное значение для каждой группы. Например, функции
SUM(), AVG(), MAX() и MIN() являются агрегатными функциями.Оконные функции, напротив, предоставляют результаты для каждой отдельной строки в наборе данных. Они выполняют агрегатную операцию над набором строк, но результат отображается как новое значение столбца в каждой строке. Оконные функции позволяют анализировать данные на уровне строк, не сворачивая их. Некоторые функции, такие как
SUM(), AVG(), MAX() и MIN(), могут использоваться как оконные функции.Для наглядности, представьте себе задачу: вернуть название отдела и максимальную зарплату в каждом отделе.
Используем агрегатные функции:
SELECT department,В этом случае мы получаем одну запись на каждый отдел (см. карточку 1).
MAX(salary) AS max_salary
FROM employee
GROUP BY department
Используем оконные функции:
SELECT employee_name,Здесь мы получим для каждой строки в исходных данных максимальную зарплату в соответствующем отделе (см. карточку 2).
salary,
department,
MAX(salary) OVER (PARTITION BY
department) AS max_salary
FROM employee
Вопрос о разнице между оконными и агрегатными функциями часто встречается на собеседованиях. Уверены, теперь вы точно ответите на этот вопрос, если столкнетесь с ним 😎
#sql #interview_problems
👍26🔥7❤4
А мы продолжаем разбор актуального теста от компании Kaspersky 🚀😊
Когда этот пост наберет 30 🔥огоньков, подкинем еще вопросов😉
Вопрос 1
* В таблице T1 больше строк, чем в T2.
* В таблице Т2 есть все значения из T1, а в Т1 не все из T2.
Выберите все варианты запросов, в результате которых будет выведено все содержимое таблицы T1 и количество строк в результате будет равняться количеству строк исходной T1.
1. SELECT * FROM T2 LEFT JOIN T1 ON (T1.key = T2.key);
2. SELECT * FROM T2 JOIN T1 ON (T1.key = T2.key);
3. SELECT * FROM T1 JOIN T2 ON (T1.key = T2.key);
4. SELECT * FROM T1;
5. SELECT * FROM T1 RIGHT JOIN T2 ON (T1.key = T2.key);
6. SELECT Т1.* FROM T2 JOIN T1 ON (T1.key = T2.key);
7. SELECT * FROM T1 LEFT JOIN T2 ON (T1.key = T2.key);
Ответы и объяснения:
1. SELECT * FROM T2 LEFT JOIN T1 ON (T1.key = T2.key);
Этот запрос не подходит, так как он начинает соединение с T2 и включает все строки из T2 и только совпадающие строки из T1. Он не возвращает все строки из T1.
2. SELECT * FROM T1 JOIN T2 ON (T1.key = T2.key);
Этот запрос не подходит, так как INNER JOIN выбирает только совпадающие строки из T1 и T2, но не возвращает все строки из T1.
3. SELECT * FROM T1 JOIN T2 ON (T1.key = T2.key);
Аналогично предыдущему.
✅ 4. SELECT * FROM T1;
Этот запрос подходит, так как он выбирает все строки из T1 без соединения с T2. Это то, что нам нужно, чтобы получить все содержимое таблицы T1.
5. SELECT * FROM T1 RIGHT JOIN T2 ON (T1.key = T2.key);
Этот запрос также не подходит. Он использует RIGHT JOIN, чтобы включить все строки из T2 и только совпадающие строки из T1. Остальные строки будут заполнены значениями NULL.
6. SELECT Т1.* FROM T2 JOIN T1 ON (T1.key = T2.key);
Не подходит аналогично 2 и 3.
✅ 7. SELECT * FROM T1 LEFT JOIN T2 ON (T1.key = T2.key);
Этот запрос подходит, так как это LEFT JOIN, который включает все строки из T1 и только совпадающие строки из T2.
Вопрос 2: В результате каких запросов выведутся строки, заканчивающиеся на "lab"?
1. SELECT Name FROM T1 WHERE RIGHT(Name, 3) = 'lab'
2. SELECT Name FROM T1 WHERE Name LIKE '%lab%'
3. SELECT Name FROM T1 WHERE Name LIKE '%lab'
4. SELECT Name FROM T1 WHERE RIGHT(Name, 5) LIKE '%lab%'
Ответы и объяснения:
✅ 1. SELECT Name FROM T1 WHERE RIGHT(Name, 3) = 'lab'
Подходит. Этот запрос выберет строки, в которых последние три символа в столбце `Name` равны "lab". Это подходящий вариант, если все имена завершаются на "lab". Например, "testlab" будет выбрано, но "laboratory" - нет.
2. SELECT Name FROM T1 WHERE Name LIKE '%lab%'
Не подходит. Этот запрос выберет строки, в которых в столбце `Name` есть подстрока "lab" в любой части строки.
✅ 3. SELECT Name FROM T1 WHERE Name LIKE '%lab'
Подходит. Этот запрос выберет строки, в которых столбец `Name` оканчивается на "lab". Это подходящий вариант, если вам нужны все строки, где имя заканчивается на "lab".
4. SELECT Name FROM T1 WHERE RIGHT(Name, 5) LIKE '%lab%'
Не подходит. Этот запрос выберет строки, в которых пять последних символов в столбце `Name` содержат подстроку "lab".
Вопрос 3: Расположите конструкции запроса на выдачу прав пользователю в правильном порядке
1. ON
2. GRANT
3. TO
Правильный порядок:
1. GRANT
2. ON
3. TO
Оператор GRANT в SQL используется для выдачи прав доступа к объектам базы данных, таким как таблицы, представления, процедуры и другие. Он предоставляет возможность управления безопасностью данных, определяя, какие действия могут выполнять определенные пользователи или роли в отношении этих объектов.
Пример использования оператора GRANT:
-- Выдача прав на чтение таблицы "employees" пользователю "user1"
GRANT SELECT ON employees TO user1;
Удачи на собеседованиях!
Не забудь нажать огонек 🔥, чтобы мы запостили продолжение.
#sql #Kaspersky #interview_problems
Когда этот пост наберет 30 🔥огоньков, подкинем еще вопросов😉
Вопрос 1
* В таблице T1 больше строк, чем в T2.
* В таблице Т2 есть все значения из T1, а в Т1 не все из T2.
Выберите все варианты запросов, в результате которых будет выведено все содержимое таблицы T1 и количество строк в результате будет равняться количеству строк исходной T1.
1. SELECT * FROM T2 LEFT JOIN T1 ON (T1.key = T2.key);
2. SELECT * FROM T2 JOIN T1 ON (T1.key = T2.key);
3. SELECT * FROM T1 JOIN T2 ON (T1.key = T2.key);
4. SELECT * FROM T1;
5. SELECT * FROM T1 RIGHT JOIN T2 ON (T1.key = T2.key);
6. SELECT Т1.* FROM T2 JOIN T1 ON (T1.key = T2.key);
7. SELECT * FROM T1 LEFT JOIN T2 ON (T1.key = T2.key);
Ответы и объяснения:
Этот запрос не подходит, так как он начинает соединение с T2 и включает все строки из T2 и только совпадающие строки из T1. Он не возвращает все строки из T1.
2. SELECT * FROM T1 JOIN T2 ON (T1.key = T2.key);
Этот запрос не подходит, так как INNER JOIN выбирает только совпадающие строки из T1 и T2, но не возвращает все строки из T1.
3. SELECT * FROM T1 JOIN T2 ON (T1.key = T2.key);
Аналогично предыдущему.
✅ 4. SELECT * FROM T1;
Этот запрос подходит, так как он выбирает все строки из T1 без соединения с T2. Это то, что нам нужно, чтобы получить все содержимое таблицы T1.
5. SELECT * FROM T1 RIGHT JOIN T2 ON (T1.key = T2.key);
Этот запрос также не подходит. Он использует RIGHT JOIN, чтобы включить все строки из T2 и только совпадающие строки из T1. Остальные строки будут заполнены значениями NULL.
6. SELECT Т1.* FROM T2 JOIN T1 ON (T1.key = T2.key);
Не подходит аналогично 2 и 3.
✅ 7. SELECT * FROM T1 LEFT JOIN T2 ON (T1.key = T2.key);
Этот запрос подходит, так как это LEFT JOIN, который включает все строки из T1 и только совпадающие строки из T2.
Вопрос 2: В результате каких запросов выведутся строки, заканчивающиеся на "lab"?
1. SELECT Name FROM T1 WHERE RIGHT(Name, 3) = 'lab'
2. SELECT Name FROM T1 WHERE Name LIKE '%lab%'
3. SELECT Name FROM T1 WHERE Name LIKE '%lab'
4. SELECT Name FROM T1 WHERE RIGHT(Name, 5) LIKE '%lab%'
Ответы и объяснения:
Подходит. Этот запрос выберет строки, в которых последние три символа в столбце `Name` равны "lab". Это подходящий вариант, если все имена завершаются на "lab". Например, "testlab" будет выбрано, но "laboratory" - нет.
2. SELECT Name FROM T1 WHERE Name LIKE '%lab%'
Не подходит. Этот запрос выберет строки, в которых в столбце `Name` есть подстрока "lab" в любой части строки.
✅ 3. SELECT Name FROM T1 WHERE Name LIKE '%lab'
Подходит. Этот запрос выберет строки, в которых столбец `Name` оканчивается на "lab". Это подходящий вариант, если вам нужны все строки, где имя заканчивается на "lab".
4. SELECT Name FROM T1 WHERE RIGHT(Name, 5) LIKE '%lab%'
Не подходит. Этот запрос выберет строки, в которых пять последних символов в столбце `Name` содержат подстроку "lab".
Вопрос 3: Расположите конструкции запроса на выдачу прав пользователю в правильном порядке
1. ON
2. GRANT
3. TO
Правильный порядок:
2. ON
3. TO
Оператор GRANT в
Пример использования оператора GRANT:
-- Выдача прав на чтение таблицы "employees" пользователю "user1"
GRANT SELECT ON employees TO user1;
Удачи на собеседованиях!
Не забудь нажать огонек 🔥, чтобы мы запостили продолжение.
#sql #Kaspersky #interview_problems
🔥56😱2
🧐 Хитрые вопросы c собеседований по SQL
Недавно мы проводили опрос среди наших читателей и выяснили, что у многих есть пробелы, казалось бы в решении простых задач по SQL. Знания есть, а навык применения их в контексте бизнеса — отсутствует. Поэтому от такого на интервью их бросает в дрожь, вводит в ступор и, как итог, — собеседование провалено.
Знакомое ощущение?
Запросы на такие каверзные вопросы растут, информации в свободном доступе нет, поэтому наши преподаватели решили поделиться с вами материалом по хитрым вопросам с собеседований по SQL!
🔗 Скачать материал: ссылка
Они помогут junior-аналитикам успешно подготовиться к собеседованиям, а кому то – расширить горизонт своих знаний.
Вот почему этот материал станет вашим незаменимым помощником:
◾️ Будете готовы к самым хитрым и сложным вопросам по SQL. Собрали максимально боевые вопросы — вы не встретите здесь воды и общих формулировок, только максимально “мясной” контент.
◾️ Объясняем все вопросы в контексте решения бизнес-задач с примерами ответов и пояснениями к ним.
◾️ Узнаете не просто объяснение всех вопросов, но и какую область знаний они проверяют, и найдете свои слабые места.
◾️ Доступность и удобство.
Команда Simulative настоятельно рекомендует вам скачать этот материал! И скоро у нас будет для вас новая полезная подборка 😉
🔗 Скачать материал: ссылка
#sql
Недавно мы проводили опрос среди наших читателей и выяснили, что у многих есть пробелы, казалось бы в решении простых задач по SQL. Знания есть, а навык применения их в контексте бизнеса — отсутствует. Поэтому от такого на интервью их бросает в дрожь, вводит в ступор и, как итог, — собеседование провалено.
Знакомое ощущение?
Запросы на такие каверзные вопросы растут, информации в свободном доступе нет, поэтому наши преподаватели решили поделиться с вами материалом по хитрым вопросам с собеседований по SQL!
🔗 Скачать материал: ссылка
Они помогут junior-аналитикам успешно подготовиться к собеседованиям, а кому то – расширить горизонт своих знаний.
Вот почему этот материал станет вашим незаменимым помощником:
◾️ Будете готовы к самым хитрым и сложным вопросам по SQL. Собрали максимально боевые вопросы — вы не встретите здесь воды и общих формулировок, только максимально “мясной” контент.
◾️ Объясняем все вопросы в контексте решения бизнес-задач с примерами ответов и пояснениями к ним.
◾️ Узнаете не просто объяснение всех вопросов, но и какую область знаний они проверяют, и найдете свои слабые места.
◾️ Доступность и удобство.
Команда Simulative настоятельно рекомендует вам скачать этот материал! И скоро у нас будет для вас новая полезная подборка 😉
🔗 Скачать материал: ссылка
#sql
❤10🔥2🎉2👍1
🔍 Ошибка в использовании алиасов в SQL-запросе
При написании SQL-запросов, мы часто руководствуемся не правилами синтаксиса SQL, а правилом «как думается, так и пишется» 😄
Например, мы хотим отобрать строки, где разница между старой и новой ценой (diff) больше
❌ Давайте посмотрим на наш «интуитивный» запрос:
Ошибка здесь заключается в том, что мы используем алиас столбца
Фильтр
✅ Правильный способ - использовать вычислимое выражение внутри
Теперь запрос отработает корректно!
❗️Имейте в виду, что внутри оператора
🤔 Какие ошибки в SQL вы совершали? Поделитесь своими вопросами и опытом в комментариях! 👇
#sql
При написании SQL-запросов, мы часто руководствуемся не правилами синтаксиса SQL, а правилом «как думается, так и пишется» 😄
Например, мы хотим отобрать строки, где разница между старой и новой ценой (diff) больше
100. Это звучит логично. Но в SQL не все так просто, и многие попадают в эту ловушку.❌ Давайте посмотрим на наш «интуитивный» запрос:
SELECT old_price - new_price AS diff
FROM goods
WHERE diff > 100
Ошибка здесь заключается в том, что мы используем алиас столбца
diff в операторе WHERE. Запрос кажется логичным, но порядок выполнения операторов в SQL-запросе не позволяет этого сделать. Фильтр
WHERE выполняется до оператора SELECT (и AS), поэтому столбец diff фактически не существует на момент выполнения WHERE. Это вызывает ошибку: "ERROR: column 'diff' does not exist."✅ Правильный способ - использовать вычислимое выражение внутри
WHERE:SELECT old_price - new_price AS diff
FROM goods
WHERE old_price - new_price > 100
Теперь запрос отработает корректно!
❗️Имейте в виду, что внутри оператора
ORDER BY, например, мы можем использовать алиасы, так как этот оператор выполняется после SELECT.🤔 Какие ошибки в SQL вы совершали? Поделитесь своими вопросами и опытом в комментариях! 👇
#sql
👍15🔥6❤1👎1
🔥 Использование frame_exclusion в оконных функциях PostgreSQL
Эта опция полезна, когда вам нужно исключить определенные строки из оконных вычислений на основе конкретных условий.
Давайте рассмотрим пример использования frame_exclusion.
У нас есть таблица
Разберемся, что мы делаем?
1. Мы выбираем данные о клиентах, датах заказов и суммах заказов из таблицы
2. Используем оконную функцию
3.
4.
5.
6. И, наконец,
Еще frame_exclusion может быть полезной, например, в таких задачах:
✅ Вычисление средней цены акций без учета выбросов
В таблице с ценами акций возникли выбросы - аномально высокие или низкие цены. Вы хотите вычислить среднюю цену акций за определенный период, исключая выбросы. Используйте frame_exclusion для исключения строк с выбросами.
✅ Определение времени простоя оборудования
Вы анализируете данные по времени простоя оборудования в производстве с учетом перерывов в работе менее 30 минут. Чтобы исключить перерывы, как раз понадобится frame_exclusion.
Еще больше примеров разбираем у нас в Симуляторе "Аналитик данных" 🔥
🕵️ Если хотите посмотреть, как устроена наша флагманская обучающая программа изнутри и понять, как вы можете бустануть свою карьеру в аналитике на реальных бизнес-кейсах, то записывайтесь на индивидуальную бесплатную экскурсию!
#sql
frame_exclusion - это дополнительная опция для оконных функций в PostgreSQL, позволяющая более гибко управлять оконными рамками. Эта опция полезна, когда вам нужно исключить определенные строки из оконных вычислений на основе конкретных условий.
Давайте рассмотрим пример использования frame_exclusion.
У нас есть таблица
orders с данными о заказах клиентов. Мы хотим рассчитать кумулятивную сумму заказов для каждого клиента, исключая из вычислений текущий заказ. Тогда код будет выглядеть так:SELECT
client_id,
order_date,
order_amount,
SUM(order_amount) OVER (
PARTITION BY client_id
ORDER BY order_date
ROWS BETWEEN UNBOUNDED
PRECEDING AND 1 PRECEDING
EXCLUDE CURRENT ROW
) AS cumulative_amount
FROM orders;
Разберемся, что мы делаем?
1. Мы выбираем данные о клиентах, датах заказов и суммах заказов из таблицы
orders.2. Используем оконную функцию
SUM, чтобы вычислить кумулятивную сумму заказов для каждого клиента.3.
PARTITION BY разделяет данные на разделы (группы) по client_id.4.
ORDER BY устанавливает порядок сортировки заказов по order_date.5.
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING определяет оконную рамку, включая все строки, начиная с первой строки и заканчивая строкой перед текущей строкой.6. И, наконец,
EXCLUDE CURRENT ROW исключает текущую строку из окна, что позволяет нам исключить текущий заказ из вычисления кумулятивной суммы.Еще frame_exclusion может быть полезной, например, в таких задачах:
✅ Вычисление средней цены акций без учета выбросов
В таблице с ценами акций возникли выбросы - аномально высокие или низкие цены. Вы хотите вычислить среднюю цену акций за определенный период, исключая выбросы. Используйте frame_exclusion для исключения строк с выбросами.
✅ Определение времени простоя оборудования
Вы анализируете данные по времени простоя оборудования в производстве с учетом перерывов в работе менее 30 минут. Чтобы исключить перерывы, как раз понадобится frame_exclusion.
Еще больше примеров разбираем у нас в Симуляторе "Аналитик данных" 🔥
🕵️ Если хотите посмотреть, как устроена наша флагманская обучающая программа изнутри и понять, как вы можете бустануть свою карьеру в аналитике на реальных бизнес-кейсах, то записывайтесь на индивидуальную бесплатную экскурсию!
#sql
👍10🔥5❤2😁1
Ошибка в SQL - не использовать COALESCE 🔥
Давайте рассмотрим пример из реального бизнеса. У нас есть таблица клиентов (
Отдел маркетинга решил создать email-рассылку, начинающуюся с фразы: "Приветствуем, имя_пользователя!" Однако, если поле name содержит
В таких случаях COALESCE может прийти на помощь:
Совет: Всегда лучше перестраховаться, особенно при вычислениях и агрегировании данных, где любая ошибка может быть незаметной, но существенной. Лучше подстелить "соломку" для безопасности.
✔️ Хотите стать крутым аналитиком данных? Приглашаем вас на персональную экскурсию в Симулятор - мы расскажем, как это сделать: simulative.ru/excursion
#sql
COALESCE - это оператор, который принимает несколько значений и возвращает первое, которое не является NULL. Если все значения NULL, он вернет NULL.COALESCE полезен, чтобы избежать случайных пропусков в вычислениях. Такие пропуски могут быть трудно заметить, особенно при вычислении средних значений на основе большого набора данных. Обычно пропуски заполняют средними, минимальными, максимальными, медианными или средними значениями, или с использованием интерполяции - это зависит от задачи.Давайте рассмотрим пример из реального бизнеса. У нас есть таблица клиентов (
clients), и в поле name хранятся имена пользователей.Отдел маркетинга решил создать email-рассылку, начинающуюся с фразы: "Приветствуем, имя_пользователя!" Однако, если поле name содержит
NULL, фраза становится "Приветствуем, !". Сами представляете выражение лица клиента, когда ему приходит такое письмо… В таких случаях COALESCE может прийти на помощь:
SELECT COALESCE(name, 'Дорогой друг')
FROM clients
Совет: Всегда лучше перестраховаться, особенно при вычислениях и агрегировании данных, где любая ошибка может быть незаметной, но существенной. Лучше подстелить "соломку" для безопасности.
✔️ Хотите стать крутым аналитиком данных? Приглашаем вас на персональную экскурсию в Симулятор - мы расскажем, как это сделать: simulative.ru/excursion
#sql
🔥11🤩6❤3👍3
Ошибка в SQL: WHERE vs HAVING 🔥
Часто встречается ошибка — оператор
✅ В чем разница
-
-
-
✅ Пример
Давайте рассмотрим типовой пример:
Здесь мы сначала отфильтровываем строки, оставляя только те, в которых дата больше или равна
Некоторые, не понимая этой разницы, пишут так:
В данном случае мы берем весь набор данных, группируем по всем датам, затем оставляем только те даты, в которых ровно 2 записи и только после этого фильтруем нужные даты.
Результат, в целом, получается одинаковый. Но насколько больше действий мы сделали. А представьте, что речь идет о миллионе строк!
✅ Важное дополнение
Более того, в данном примере мы в
Пример:
#sql
Часто встречается ошибка — оператор
HAVING используется вместо WHERE в запросах с агрегацией. И это неверно! Давайте разберемся, в чем же разница.✅ В чем разница
-
WHERE выполняет фильтрацию строк в исходном наборе данных, отсеивая неподходящие записи до группировки-
GROUP BY формирует группы на основе значений в столбце-
HAVING применяется к уже сгруппированному набору данных и фильтрует их на основе агрегированных данных, т.е. после группировки✅ Пример
Давайте рассмотрим типовой пример:
SELECT date, COUNT(*)
FROM transactions t
WHERE date >= '2019-01-01'
GROUP BY date
HAVING COUNT(*) = 2
Здесь мы сначала отфильтровываем строки, оставляя только те, в которых дата больше или равна
2019-01-01. Затем формируем группы по дате (из тех, которые остались) и оставляем только те, в которых ровно две записи.Некоторые, не понимая этой разницы, пишут так:
SELECT date, COUNT(*)
FROM transactions t
GROUP BY date
HAVING COUNT(*) = 2 AND date >= '2019-01-01'
В данном случае мы берем весь набор данных, группируем по всем датам, затем оставляем только те даты, в которых ровно 2 записи и только после этого фильтруем нужные даты.
Результат, в целом, получается одинаковый. Но насколько больше действий мы сделали. А представьте, что речь идет о миллионе строк!
✅ Важное дополнение
Более того, в данном примере мы в
HAVING указывали те же столбцы, что используются в группировке (date). А если мы укажем столбец, который не используется в GROUP BY или внутри агрегатной функции, то мы просто получим ошибку - запрос не отработает. Пример:
SELECT date, COUNT(*)
FROM transactions t
GROUP BY date
HAVING COUNT(*) = 2 AND type_id >= 5
#sql
👍30
Ошибка в SQL: Избыточные подзапросы 🔥
Проверяя работы студентов в нашем Симуляторе «Аналитик данных», мы часто встречаемся с ошибкой избыточных подзапросов. То, что можно было решить в 1 запрос, ребята решают за 3.
✅ Почему так происходит
Это происходит из-за того, что многие пишут SQL-запросы также, как это «звучит» в их голове. А SQL работает немного иначе - на нем нужно буквально «мыслить». Но это приходит с опытом, за счет большого количества практики (как правило, к концу модуля по SQL такие ошибки уже никто не делает).
✅ Пример
Давайте приведем пример. Он будет довольно простым - наверняка вы бы написали здесь сразу один запрос. Однако, эта ошибка проявляется даже в таких случаях, чего уж говорить про более сложные.
Итак, задача: вывести
И это еще не все — можно и побольше накрутить. Но зачем так, если можно так:
✅ А как писать такие запросы?
Отсекайте лишнее. Напишите запрос так, как получилось. Затем попробуйте упростить. Затем еще. И так до тех пор, пока не получите минимально возможный запрос.
✅ Совет
Не старайтесь сразу писать сложные и оптимизированные конструкции. Напишите сначала, как сможете, а затем пытайтесь упростить запрос. Как говорил знаменитый дядюшка Кнут:
✅ Заключение
Хотите тоже стать аналитиком, который пишет только качественный код и сходу решает сложные задачи? Записывайтесь на персональную экскурсию в Симулятор - расскажем как 👇🏻
🔗 Записаться на экскурсию: ссылка
#sql
Проверяя работы студентов в нашем Симуляторе «Аналитик данных», мы часто встречаемся с ошибкой избыточных подзапросов. То, что можно было решить в 1 запрос, ребята решают за 3.
✅ Почему так происходит
Это происходит из-за того, что многие пишут SQL-запросы также, как это «звучит» в их голове. А SQL работает немного иначе - на нем нужно буквально «мыслить». Но это приходит с опытом, за счет большого количества практики (как правило, к концу модуля по SQL такие ошибки уже никто не делает).
✅ Пример
Давайте приведем пример. Он будет довольно простым - наверняка вы бы написали здесь сразу один запрос. Однако, эта ошибка проявляется даже в таких случаях, чего уж говорить про более сложные.
Итак, задача: вывести
id транзакции и предыдущую сумму транзации со знаком минус. Вот решение студена:SELECT id,
LAG(neg) OVER(ORDER BY id)
AS lg
FROM (
SELECT id, sm, -sm AS neg
FROM (
SELECT id, sum AS sm
FROM transactions t
) t
) t1
И это еще не все — можно и побольше накрутить. Но зачем так, если можно так:
SELECT id, LAG(-sum) OVER(ORDER BY id)
FROM transactions t
✅ А как писать такие запросы?
Отсекайте лишнее. Напишите запрос так, как получилось. Затем попробуйте упростить. Затем еще. И так до тех пор, пока не получите минимально возможный запрос.
✅ Совет
Не старайтесь сразу писать сложные и оптимизированные конструкции. Напишите сначала, как сможете, а затем пытайтесь упростить запрос. Как говорил знаменитый дядюшка Кнут:
Преждевременная оптимизация - корень всех зол
✅ Заключение
Хотите тоже стать аналитиком, который пишет только качественный код и сходу решает сложные задачи? Записывайтесь на персональную экскурсию в Симулятор - расскажем как 👇🏻
🔗 Записаться на экскурсию: ссылка
#sql
👍9🔥5❤4