Data Science. SQL hub
35.9K subscribers
1.18K photos
99 videos
37 files
1.19K links
По всем вопросам- @workakkk

@itchannels_telegram - 🔥лучшие ит-каналы

@ai_machinelearning_big_data - Machine learning

@pythonl - Python

@pythonlbooks- python книги📚

@datascienceiot - ml книги📚

РКН: https://vk.cc/cIi9vo

#VRHSZ
Download Telegram
🖥 SQL-запросы, которые вы рано или поздно погуглите

Отвечу на вопросы, которые возникают у новичков в SQL, в частности в PostgreSQL и BigQuery. Мы не будем обсуждать совсем базовые SELECT, CREATE или DROP.

Для удобства восприятия будем использовать тестовые данные. Первая таблица players содержит данные о пользователях и дате установки мобильной игры:

|playerId|name |installationDate|game |os |
|--------|----------------|----------------|----------|----------|
|9e8a0174|Трофимова Алёна |2023-07-30 |basketball|iOS 16 |
|3e2e04ad|Семенова Алиса |2022-07-21 |consumer |iOS 13 |
|642eafb2|Абрамова Диана |2022-06-06 |curtain |iOS 15 |
|8c231f49|Ефимова Ульяна |2022-06-21 |conductor |Android 12|
|a085caf1|Захаров Михаил |2023-04-11 |appear |Android 11|
|c4deb869|Николаева Марта |2022-03-31 |possible |iOS 11 |


вторая, levels, — даты прохождения игроком с определенным ID того или иного уровня:

|playerId|level|completionDate|
|--------|-----|--------------|
|7b50274d|6 |2023-05-17 |
|b0c9a9da|20 |2022-02-19 |
|09b3d5b5|15 |2022-07-22 |
|52b3bfa9|11 |2022-02-18 |
|3e2e04ad|17 |2022-08-17 |
|642eafb2|17 |2022-04-14 |
|8c231f49|20 |2022-05-30 |
|a085caf1|20 |2023-02-24 |
|36545ec1|16 |2022-08-10 |
|44e9653f|3 |2023-06-02 |



Я буду верстать в BigQuery на таком же датасете, так что использую соответствующий диалект.


INNER JOIN
Это тип объединения по умолчанию, и он оставит наименьшее число строк. Слово INNER можно опустить:

SELECT
p.playerId,
installationDate,
game,
level,
completionDate
FROM `project.tutorials.players` AS p
JOIN `project.tutorials.levels` AS l ON p.playerId = l.playerId;



Посмотрим, что здесь происходит:

• В строках 1-6 мы выбираем только необходимые столбцы;
• 7-8: командой AS задаем псевдонимы таблицам;
• 8: определяем логику объединения по совпадающим playerId. Это означает также, что мы сохраним данные только об первом попавшемся уровне.

Получим всего четыре строки:
|playerId|name |installationDate|game |level|completionDate|
|--------|--------------|----------------|---------|-----|--------------|
|3e2e04ad|Семенова Алиса|2022-07-21 |consumer |17 |2022-08-17 |
|642eafb2|Абрамова Диана|2022-06-06 |curtain |17 |2022-04-14 |
|8c231f49|Ефимова Ульяна|2022-06-21 |conductor|20 |2022-05-30 |
|a085caf1|Захаров Михаил|2023-04-11 |appear |20 |2023-02-24 |


OUTER JOIN
Этот тип объединения, напротив, куда «добрее» и в случае FULL-объединения сохранит записи обо всех игроках и всех пройденных уровнях:

SELECT
p.playerId,
installationDate,
game,
level,
completionDate
FROM `project.tutorials.players` AS p
FULL OUTER JOIN `project.tutorials.levels` AS l ON p.playerId = l.playerId;



У нас появятся записи, где playerId пуст, поскольку попросили мы идентификаторы только из первой таблицы:

🔍 Читать

@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥4❤3
🚀 Бесплатный курс. Специализация Data Science Fundamentals with Python and SQL

Создайте основу для своей карьеры в области Data Science. Получите практический опыт работы с Jupyter, Python, SQL. Выполнять статистический анализ на реальных массивах данных.

• Курс

@sqlhub
👍11❤4🔥1
🖥 SQL Translator - это инструмент для преобразования запросов на естественном языке в SQL-запросы с помощью искусственного интеллекта. Этот проект является 100% бесплатным и с открытым исходным кодом.

git clone https://github.com/whoiskatrin/sql-translator.git

▪Github
▪Проект

@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23❤3🔥2
Media is too big
VIEW IN TELEGRAM
📊Python Matplotlib. Визуализация данных на PRO уровне.


📌 Видео
📌 Код и полезные ресурсы

@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥2❤1
🖥 SQL-запросы, которые вы рано или поздно погуглите, часть 2

На сей раз я использую таблицу subject_selection, которая описывает изучаемые студентами предметы:

|student_id|subject|semester|student_name|
|----------|-------|--------|------------|
|eb1490a6 |Физика |2 |Иван |
|1c5bf433 |Физика |4 |Андрей |
|b16a764b |Тервер |1 |Ирина |
|48b3a7f6 |Матстат|2 |Мария |
|c179c5cc |Тервер |2 |Сергей |
|6306ceed |Матстат|1 |Инна |
|5853f444 |Иняз |3 |Эрик |
|… |… |… |… |
|550ca6a5 |Тервер |2 |Елена |



Запросы исполнены на диалекте BigQuery.

WHERE + LIKE: найти все таблицы с определенным столбцом
Допустим, администратор университетской базы данных управляет большим хранилищем и уже не тратит усилия на запоминания всех структур таблиц. Он хочет вспомнить, в каких наборах упоминались студенты.

Во многих СУБД на базе SQL существует information_schema с метаданными, к которой можно обращаться с запросами. Вот так, к примеру, она выглядит в BigQuery (документация): *в изображении.

Вы также можете обратиться к:

▪️резервной копии таблицы (TABLE_SNAPSHOT);
▪️перечню запросов, выполненных определенным сотрудником (JOBS_BY_USER);
▪️частоте использования расшаренных датасетов (SHARED_DATASET_USAGE).

Чтобы получить искомый список таблиц, содержащими столбец с подстрокой ‘student’, нужно запустить такую команду:

SELECT * FROM `project.tutorials.INFORMATION_SCHEMA.COLUMNS`
WHERE column_name LIKE '%student%'


В результате мы получим список с 20+ параметрами. Располагая также данными о типе столбца, возможности пропусков в нем и прочих интересных настройках вы сможете управлять своими данными на новом уровне: ведь по любому из полей можно производить фильтрацию, модификацию и проч.

📌 Читать весь разбор

@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍5🔥1
Forwarded from Just Xor
🔥 Дайджест полезных материалов из мира SQL за неделю

Почитать:
— Искусство ETL. FAQ по Data Cooker ETL
— Microsoft предлагает БЕСПЛАТНЫЕ онлайн курсы с сертификацией
— Clickhouse — непростая жизнь в продакшене
— MySQL в Google Colab: Бесшовная интеграция
— Искусство ETL. Пишем собственный движок SQL на Spark [часть 5 из 5]
— Bamboolib : Инструментарий для интеллектуального исследования и анализа данных
— 7 шагов по контейнеризации Python-приложений
— Understanding Joins in SQL
— My Experience learning Python and SQL
— SQL 50–1683. Invalid Tweets
— Tudo que você precisa saber sobre SQL
— Select transactions
— Temp table in SQL Server
— Memory behind Postgres
— Discover the Hidden Powers of PostgreSQL: Lateral Joins and JSON Columns Decoded!
— Bitmap Scan in YugabyteDB
— SQL 50–1148. Article Views I

Посмотреть:
🌐 Вся база SQL для начинающих за 1 час
🌐 SQL For Web Developers - Complete Database Course
🌐 Python Matplotlib. Визуализация данных на PRO уровне. (⏱ 24:43)
🌐 Устраиваемся на работу. Решаем тестовое задание на позицию Python Junior. (⏱ 20:28)
🌐 Уроки Golang с нуля /#29 - Дженерики/обобщения (⏱ 10:52)
🌐 Уроки Golang с нуля /#30 - Горутины (⏱ 08:09)
🌐 Как защитить телеграм бота от атак и перегрузок. (⏱ 08:29)

Хорошего дня!

@sqlhub
👍13🔥3❤2
🖥StereoDB

Сверхбыстрая и легкая база данных внутрипроцессной памятм, написанная на языке F#, поддерживающая: транзакции, вторичные индексы, персистентные структуры данных и инструменты управления памятью.

StereoDB поддерживает создание Stateful Services (API или ETL Worker), которые хранят все данные в памяти и могут обеспечить миллионы запросов в секунду для RPS с одного узла.

• Github

@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤2🔥1
Использование рекурсивных запросов для управления иерархиями данных

Некоторые таблицы в SQL могут иметь неявный вид иерархии данных. Например, в нашей таблице сотрудников для каждого сотрудника имеется идентификатор manager_id. У нас есть менеджер, который отвечает за других менеджеров, которые, в свою очередь, отвечают за других сотрудников, и так далее.

При такой организации мы можем иметь иерархию различных уровней. В каждой строке столбец manager_id относится к строке, находящейся на непосредственном верхнем уровне иерархии. В таких случаях хорошим запросом является получение списка всех сотрудников, подчиняющихся генеральному директору компании (который в данном случае имеет идентификатор employee_id, равный 110). Для этого используем следующий запрос

WITH RECURSIVE subordinate AS (
SELECT
employee_id,
first_name,
last_name,
manager_id
FROM employee
WHERE employee_id = 110 -- id of the top hierarchy employee (CEO)

UNION ALL

SELECT
e.employee_id,
e.first_name,
e.last_name,
e.manager_id
FROM employee e
JOIN subordinate s
ON e.manager_id = s.employee_id
)
SELECT
employee_id,
first_name,
last_name,
manager_id
FROM subordinate ;


В этом запросе мы создали рекурсивный CTE под названием subordinate. Он является ключевой частью запроса, поскольку проходит по иерархии данных, переходя от одной строки к строкам иерархии, расположенным непосредственно под ней.

Есть два подзапроса, соединенных между собой UNION ALL; первый подзапрос возвращает верхнюю строку иерархии, а второй запрос возвращает следующий уровень, добавляя эти строки к промежуточному результату запроса. Затем снова выполняется второй подзапрос, возвращающий следующий уровень, который снова добавляется к промежуточному результату. Этот процесс повторяется до тех пор, пока в промежуточный результат не будет добавлено ни одной новой строки. Наконец, главный запрос возвращает данные в том виде, в котором мы ожидаем.

@sqlhub
👍19🔥3❤2
🖥 Предположим, что нам необходимо получить данные о сотруднике, имеющем вторую по величине зарплату в компании. Мы можем использовать следующий запрос:

WITH employee_ranking AS (
SELECT
employee_id,
last_name,
first_name,
salary,
RANK() OVER (ORDER BY salary DESC) as ranking
FROM employee
)
SELECT
employee_id,
last_name,
first_name,
salary
FROM employee_ranking
WHERE ranking = 2

Условие WHERE ranking = 2 используется для фильтрации строк второй по величине зарплаты. Обратите внимание, что на позиции 2 может находиться более одного сотрудника, если у них одинаковая зарплата.

На данном этапе важно понять поведение функции RANK(), а также других доступных функций, таких как ROW_NUMBER() и DENSE_RANK(). Эта тема подробно рассматривается в статье - "Обзор функций ранжирования в SQL". Я рекомендую прочитать эту статью, если вам придется работать с различными видами ранжирования.

@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤6🔥4
Сегодня вышла новая версию ElectricSQL.

ElectricSQL - это опенсорс платформа для локальной разработки, позволяющая легко создавать высококачественные современные приложения с мгновенной реактивностью, многопользовательской совместной работой в реальном времени и бесконфликтной поддержкой автономной работы.

Local-first - это новая парадигма разработки, при которой код приложения напрямую обращается к встроенной локальной базе данных, а данные синхронизируются в фоновом режиме посредством активной репликации базы данных. Поскольку код приложения обращается непосредственно к локальной базе данных, приложения работают мгновенно. Данные синхронизируются в фоновом режиме с помощью активной репликации.

• Github
• Документация

@Sqlhub
👍11❤3🔥1
Уроки по T-SQL

1. Быстро и подробно об основах реляционных баз данных
2. Знакомимся с основными понятиями Transact SQL
3. Работа с временными таблицами: CREATE TABLE, DROPE TABLE, ALTER TABLE
4. Быстрый разбор выборки данных в T-SQL
5. Внесение изменений в базу данных T-SQL
6. Оператор Union за 5 мин T-SQL
7. Оператор CASE за 2 мин T-SQL

#video #sql

📌Видео

@Sqlhub
👍4🔥4❤1
🖥 🖥SQLiDetector

Python-скрипт, позволяющий обнаружить SQL-инъекции путем отправки нескольких запросов и проверки regex-шаблонами для различных баз данных.


• Github

@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2🔥1
sqlparse.pdf
187.2 KB
Sqlparse: парсинг SQL-операторов

Sqlparse - это невалидирующий парсер SQL для Python. Он обеспечивает поддержку разбора, разбиения и форматирования SQL-операторов.

$ pip install sqlparse
import sqlparse


📌 Файл с примерам кода и документацией по работе в закрепе.


raw = 'select * from foo; select * from bar;'
statements = sqlparse.split(raw)
statements
['select * from foo;', 'select * from bar;']


first = statements[0]
print(sqlparse.format(first, reindent=True, keyword_case='upper'))
SELECT *
FROM foo;

>>> # Parsing a SQL statement:
parsed = sqlparse.parse('select * from foo')[0]
parsed.tokens
[<DML 'select' at 0x7f22c5e15368>, <Whitespace ' ' at 0x7f22c5e153b0>, <Wildcard '*' … ]


@sqlhub
👍7🔥2❤1
🖥 Pipelined Relational Query Language (PRQL)

PRQL - это современный язык для преобразования данных, который меняет обращение к базе данных на логически выстроенный пайплайн (конвейер).
Как и SQL, он легко читается, является явным и декларативным. Но в отличие от SQL, он формирует логический пайплайн преобразований и поддерживает такие абстракции, как переменные и функции. Он может использоваться с любой базой данных, использующей SQL.

from tracks
filter artist == "Bob Marley" # Each line transforms the previous result
aggregate { # `aggregate` reduces each column to a value
plays = sum plays,
longest = max length,
shortest = min length, # Trailing commas are allowed
}


• Github

@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥5❤2
🔥 Дайджест полезных материалов из мира SQL за неделю

Почитать:
— Небольшой тест нескольких БД при работе с многими таблицами
— Визуализация распределений вероятностей в Python.
— 15 лучших бесплатных курсов по Linux
— Погружаемся в базы данных и SQL: полезные материалы и инструменты от сотрудников Selectel
— Optimizing SQL Performance with Execution Plans
— Data Analysis with SQL
— Dominando la Preparación de Datos para Análisis: Funciones y Técnicas Esenciales
— Autoscout24 SQL Analysis
— SQL Pro tips : Oracle SQL CROSS JOIN with UNPIVOT
— SQL Pro tips : Oracle XE Quick Start
— Leveraging Apache Age for Advanced Data Analytics
— Choosing an OLAP Engine for Financial Risk Management: What to Consider?
— SQL Window Functions
— Parallels and MSSQL Server

Посмотреть:
🌐 Django начало работы. (⏱ 08:18)
🌐 Go - SQL Databases in Golang with the database/sql package
🌐 Популярная задача с собеседования в Яндекс #python #задача #программирование #собеседование (⏱ 01:00)
🌐 Новые функции в IOS 17 (⏱ 00:29)
🌐 TokenFlow редактирование видео с помощью текстового описания (⏱ 00:22)
🌐 Парсер телеграм каналов на Python. Гайд по написанию мощного бота. (⏱ 11:58)
🌐 Задача из Собеседования в Яндекс с зарплатой 85000 рублей #python #собеседование #задача #yandex (⏱ 00:59)
🌐 Асинхронный парсинг сайтов на Python (⏱ 22:06)

Хорошего дня!

@sqlhub
👍6🔥2❤1
This media is not supported in your browser
VIEW IN TELEGRAM
🖥 Интерактивная SQL шпаргалка

@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53🔥15❤4
🐍Как Snowflake повышает эффективность dbt-моделей на Python

dbt — это инструмент, помогающий управлять всеми трансформациями данных, которые выполняются в базах данных с использованием SQL.

Допустим, у вас есть таблица с общим числом клиентских заказов, и нужно подсчитать, сколько из них пришлось на праздничные дни. Выполнить эту задачу можно с помощью двух SQL-запросов.

1. Добавить столбец is_holiday в таблицу sf100_orders, объединив ее с all_holidays. Назвать полученную таблицу sf100_orders_annotated.
2. Подсчитать строки, для которых is_holiday=true в таблице sf100_orders_annotated.

Эти два шага объединяют исходные данные, визуализированные с помощью dbt: в изображении.

Производный граф: из двух исходных таблиц составляется таблица count_holidays

Используя dbt, можно записать эти две трансформации в виде “dbt-моделей”, которые представляют собой файлы, содержащие SQL и некоторую конфигурацию dbt (при необходимости):
-- sf100_orders_annotated.sql
{{ config(materialized='table') }}

select a.*, b.date is not null is_holiday
from {{ref('sf100_orders')}} a
left join {{ref('all_holidays')}} b
on a.o_orderdate = b.date
-- count_holidays.sql
{{config(materialized='table')}}

select count(*) total_days
, count_if(is_holiday) holiday_count
, holiday_count/total_days ratio
from {{ref('sf100_orders_annotated')}}


Эти два файла выглядят как типичный SQL, но с некоторым отличием. Вместо ссылок на таблицы dbt позволяет ссылаться на другие “модели” с помощью аннотаций {{ref(‘sf100_orders_annotated’)}}. Таким образом, dbt определяет связь и зависимости между всеми трансформациями, через которые проходят данные.

📌 Продолжение

@sqlhub
👍6❤4🔥1