Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/limitedeternity/db-homework-queries
Курс "Базы данных": Домашнее задание "Cложные запросы"
https://github.com/limitedeternity/db-homework-queries
itmo-university
Last synced: 14 days ago
JSON representation
Курс "Базы данных": Домашнее задание "Cложные запросы"
- Host: GitHub
- URL: https://github.com/limitedeternity/db-homework-queries
- Owner: limitedeternity
- License: mit
- Created: 2023-12-02T13:11:09.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2023-12-02T13:13:44.000Z (about 1 year ago)
- Last Synced: 2024-11-20T07:42:20.873Z (about 1 month ago)
- Topics: itmo-university
- Language: PLpgSQL
- Homepage:
- Size: 13.7 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Домашнее задание 2
Изучаем группировки, сложные запросы, CTE
# Задание 1
15 баллов
Возьмем датасет такси Нью-Йорка:
https://data.cityofnewyork.us/Transportation/2018-Yellow-Taxi-Trip-Data/t29m-gskq
Поэтапно превратим его в SQL-таблицу.
Первым делом создадим таблицу с текстовыми полями. По полю на каждый столбец.
Прочитаем с помощью запроса COPY.
Создадим новые поля с адекватными типами, старые строковые удалим.
VendorID -> целочисленное
tpep_pickup_datetime, tpep_dropoff_datetime -> timestamp
passenger_count -> целочисленное
trip_distance -> вещественное
RatecodeID -> целочисленное
store_and_fwd_flag -> односимвольное или enum
PULocationID,DOLocationID,payment_type,fare_amount,extra - целочисленные
mta_tax,tip_amount,tolls_amount,improvement_surcharge,total_amount - с фиксированной точкой
Оформим последовательность действий в виде процедуры на PL/pgSQL.
Процедура должна предполагать, что файл скачан и находится где то на сервере. И принимать имя файла в качестве параметра.
# Задание 2
15 баллов
Найдем для каждого перевозчика
* среднюю длину поездки
* дисперсию стоимости поездки
* количество поездок, начавшихся с 6 утра до 6 вечера
* сколько раз его водитель встречал Новый год в поездке
* максимальную стоимость поездки в среднем на пассажира
Добьемся того, чтобы ответы на данные вопросы были взяты с одного состояния базы.
Это можно сделать с помощью одного сложного запроса или несколькими с правильным,
но не избыточным уровнем изоляции.# Задание 3
20 баллов
Найдем для каждой поездки
* долю чаевых в расходах, понесенных пассажиром
* разницу между долей чаевых этой поездки и средней долей по всем поездкам в датасете
* разницу между долей чаевых этой поездки и средней долей по всем поездкам данного перевозчика
* разницу между долей чаевых этой поездки и средней долей по всем более дальним поездкам, начавшимся в тот же день
* ранг данной поездки по средней скорости у данного переводчика
Добейтесь того, чтобы ответы на данные вопросы были взяты с одного состояния базы.
Это можно сделать с помощью одного сложного запроса или несколькими с правильным,
но не избыточным уровнем изоляции.## Задание 4
30 баллов
```
CREATE TABLE nums(a INT CHECK (a > 0), b INT CHECK(b > 0));
```Напишем CTE-запрос, который реализует массовое применение алгоритма Евклида и вернет ответ с тремя полями:
a, b, gcd.Если одно из чисел 0, то gcd должно содержать другое число.
## Задание 5
20 баллов
```
CREATE TABLE staff(emp_id INT PRIMARY KEY, reports_to INT REFERENCES staff(emp_id));
```Дана таблица сотрудников.
* emp_id - id сотрудника
* reports_to - id менеджера
У генерального директора reports_to - NULL.
Гарантируется, что в таблице один и только один генеральный директор.
Напишем запрос, который вернет две колонки: emp_id и level - количество начальников над данным сотрудником.
Для генерального директора нужно вернуть 0, для его непосредственных подчиненных - 1 и т.д.
Есть проблема в том, что в таблице не исключено наличие циклов.
Будем считать, что в оргазации вряд ли будет более двадцати уровней иерархии.
Если для каких-то пользователей не дошли до генерального директора за двадцать шагов, остановимся и в ответе породим -1
в колонке level.Для сотрудников, которые не являются частью цикла, должно быть порождено количество начальников над данным сотрудником.
Ожидается решение через одно CTE.
Решения типа "процедура с циклом" не проверяются и получают 0 баллов. Только CTE, только хардкор.
## Бонусное задание
30 баллов
Решите задачу определения циклов в задании 5 без закладки на фиксированный лимит.
Помните о том, что цикл - это не только "круг". Это может быть что-то типа a -> b -> c -> b.