diff --git a/1 b/1 new file mode 100644 index 0000000..e69de29 diff --git a/docker_compose/docker-compose.yml b/docker_compose/docker-compose.yml index 7e02491..a92edfc 100644 --- a/docker_compose/docker-compose.yml +++ b/docker_compose/docker-compose.yml @@ -12,6 +12,7 @@ services: - postgres_host volumes: - "${SOURCE_DATA}/pg_data:/var/lib/postgresql/data" + - "${SOURCE_DATA}:/usr/share/data_store" environment: POSTGRES_HOST_AUTH_METHOD: "trust" redis_host: diff --git a/homeworks/hw1_db-initialize.sql b/homeworks/hw1_db-initialize.sql new file mode 100644 index 0000000..96dc770 --- /dev/null +++ b/homeworks/hw1_db-initialize.sql @@ -0,0 +1,180 @@ +-- Удаляем таблицы если они уже есть. +DROP TABLE IF EXISTS kinopoisk_data; +DROP TABLE IF EXISTS person2content; +DROP TABLE IF EXISTS films; +DROP TABLE IF EXISTS persons; + +-- Создаем таблицу 'films'. +CREATE TABLE films ( + id SERIAL PRIMARY KEY, + title VARCHAR(128), + country VARCHAR(64), + box_office BIGINT, + release_date DATE +); + +-- Создаем таблицу 'persons'. +CREATE TABLE persons ( + id SERIAL PRIMARY KEY, + fio VARCHAR(128) unique +); + +-- Создаем таблицу 'person2person'. +CREATE TABLE person2content ( + person_id INT NOT NULL, + film_id INT NOT NULL, + person_type VARCHAR(64), + PRIMARY KEY(person_id, film_id, person_type), + FOREIGN KEY(person_id) REFERENCES persons (id), + FOREIGN KEY(film_id) REFERENCES films (id) +); + +-- Создаем временную таблицу 'kinopoisk_data'. +CREATE temp TABLE kinopoisk_data( + id SERIAL PRIMARY KEY, + title VARCHAR(128), + person_fio VARCHAR(128), + person_type VARCHAR(64) +); + + Добавление данных по фильму. +INSERT INTO films(title, country, box_office, release_date) VALUES + ('Отступники', 'США', 291465034, to_date('2006-09-26', 'YYYY-MM-DD')) + ,('Матрица', 'США', 463517383, to_date('1999-03-24', 'YYYY-MM-DD')) + ,('Властелин колец: Возвращение Короля', 'Новая Зеландия, США', 1118887224, to_date('2003-12-01', 'YYYY-MM-DD')) + ,('Интерстеллар', 'США, Великобритания, Канада', 677463813, to_date('2014-10-26', 'YYYY-MM-DD')) + ,('Начало', 'США, Великобритания', 828322032, to_date('2010-07-08', 'YYYY-MM-DD')); + + Создание временные данные. +WITH persons_data(title, person_type, fio) AS (VALUES + ('Отступники', 'Режиссер', 'Мартин Скорсезе') + ,('Отступники', 'Сценарист', 'Уильям Монахэн') + ,('Отступники', 'Сценарист', 'Алан Мак') + ,('Отступники', 'Сценарист', 'Феликс Чон') + ,('Отступники', 'Продюсер', 'Брэд Грэй') + ,('Отступники', 'Продюсер', 'Грэм Кинг') + ,('Отступники', 'Продюсер', 'Джанни Нуннари') + ,('Отступники', 'Оператор', 'Михаэль Балльхаус') + ,('Отступники', 'Композитор', 'Говард Шор') + ,('Отступники', 'Художник', 'Кристи Зиа') + ,('Отступники', 'Художник', 'Тереза Кэррикер-Тейер') + ,('Отступники', 'Художник', 'Сэнди Пауэлл') + ,('Отступники', 'Монтаж', 'Тельма Скунмейкер') + ,('Отступники', 'Актер', 'Леонардо ДиКаприо') + ,('Отступники', 'Актер', 'Мэтт Дэймон') + ,('Отступники', 'Актер', 'Джек Николсон') + ,('Отступники', 'Актер', 'Марк Уолберг') + ,('Отступники', 'Актер', 'Мартин Шин') + ,('Отступники', 'Актер', 'Рэй Уинстон') + ,('Отступники', 'Актриса', 'Вера Фармига') + ,('Отступники', 'Актер', 'Энтони Андерсон') + ,('Отступники', 'Актер', 'Алек Болдуин') + ,('Отступники', 'Актер', 'Кевин Корригэн') + ,('Матрица','Режиссер','Лана Вачовски') + ,('Матрица','Режиссер','Лилли Вачовски') + ,('Матрица','Сценарист','Лана Вачовски') + ,('Матрица','Сценарист','Лилли Вачовски') + ,('Матрица','Продюсер','Джоэл Силвер') + ,('Матрица','Продюсер','Брюс Берман') + ,('Матрица','Продюсер','Дэн Краччиоло') + ,('Матрица','Оператор','Билл Поуп') + ,('Матрица','Композитор','Дон Дэвис') + ,('Матрица','Художник','Оуэн Патерсон') + ,('Матрица','Художник','Хью Бэйтап') + ,('Матрица','Художник','Мишель МакГэхи') + ,('Матрица','Монтаж','Зак Стэнберг') + ,('Матрица','Актер','Киану Ривз') + ,('Матрица','Актер','Лоренс Фишбёрн') + ,('Матрица','Актриса','Кэрри-Энн Мосс') + ,('Матрица','Актер','Хьюго Уивинг') + ,('Матрица','Актриса','Глория Фостер') + ,('Матрица','Актер','Джо Пантольяно') + ,('Матрица','Актер','Маркус Чонг') + ,('Матрица','Актер','Джулиан Араханга') + ,('Матрица','Актер','Мэтт Доран') + ,('Матрица','Актриса','Белинда МакКлори') + ,('Властелин колец: Возвращение Короля','Режиссер','Питер Джексон') + ,('Властелин колец: Возвращение Короля','Сценарист','Фрэн Уолш') + ,('Властелин колец: Возвращение Короля','Сценарист','Филиппа Бойенс') + ,('Властелин колец: Возвращение Короля','Сценарист','Питер Джексон') + ,('Властелин колец: Возвращение Короля','Продюсер','Питер Джексон') + ,('Властелин колец: Возвращение Короля','Продюсер','Барри М. Осборн') + ,('Властелин колец: Возвращение Короля','Продюсер','Фрэн Уолш') + ,('Властелин колец: Возвращение Короля','Оператор','Эндрю Лесни') + ,('Властелин колец: Возвращение Короля','Композитор','Говард Шор') + ,('Властелин колец: Возвращение Короля','Художник','Грант Мейджор') + ,('Властелин колец: Возвращение Короля','Художник','Джо Бликли') + ,('Властелин колец: Возвращение Короля','Художник','Саймон Брайт') + ,('Властелин колец: Возвращение Короля','Монтаж','Джэми Селкирк') + ,('Властелин колец: Возвращение Короля','Актер','Элайджа Вуд') + ,('Властелин колец: Возвращение Короля','Актер','Вигго Мортенсен') + ,('Властелин колец: Возвращение Короля','Актер','Шон Эстин') + ,('Властелин колец: Возвращение Короля','Актер','Иэн Маккеллен') + ,('Властелин колец: Возвращение Короля','Актер','Орландо Блум') + ,('Властелин колец: Возвращение Короля','Актер','Доминик Монахэн') + ,('Властелин колец: Возвращение Короля','Актер','Билли Бойд') + ,('Властелин колец: Возвращение Короля','Актер','Энди Серкис') + ,('Властелин колец: Возвращение Короля','Актриса','Миранда Отто') + ,('Властелин колец: Возвращение Короля','Актер','Бернард Хилл') + ,('Интерстеллар','Режиссер','Кристофер Нолан') + ,('Интерстеллар','Сценарист','Кристофер Нолан') + ,('Интерстеллар','Сценарист','Джонатан Нолан') + ,('Интерстеллар','Продюсер','Кристофер Нолан') + ,('Интерстеллар','Продюсер','Линда Обст') + ,('Интерстеллар','Продюсер','Эмма Томас') + ,('Интерстеллар','Оператор','Хойте Ван Хойтема') + ,('Интерстеллар','Композитор','Ханс Циммер') + ,('Интерстеллар','Художник','Нэйтан Краули') + ,('Интерстеллар','Художник','Кенделл Эллиотт') + ,('Интерстеллар','Художник','Эггерт Кетилссон') + ,('Интерстеллар','Монтаж','Ли Смит') + ,('Интерстеллар','Актер','Мэттью МакКонахи') + ,('Интерстеллар','Актриса','Энн Хэтэуэй') + ,('Интерстеллар','Актриса','Джессика Честейн') + ,('Интерстеллар','Актер','Маккензи Фой') + ,('Интерстеллар','Актер','Майкл Кейн') + ,('Интерстеллар','Актер','Дэвид Гяси') + ,('Интерстеллар','Актер','Уэс Бентли') + ,('Интерстеллар','Актер','Кейси Аффлек') + ,('Интерстеллар','Актер','Джон Литгоу') + ,('Интерстеллар','Актер','Мэтт Дэймон') + ,('Начало','','Маккензи Фой') + ,('Начало','Режиссер','Кристофер Нолан') + ,('Начало','Сценарист','Кристофер Нолан') + ,('Начало','Продюсер','Кристофер Нолан') + ,('Начало','Продюсер','Эмма Томас') + ,('Начало','Продюсер','Закария Алауи') + ,('Начало','Оператор','Уолли Пфистер') + ,('Начало','Композитор','Ханс Циммер') + ,('Начало','Художник','Гай Диасй') + ,('Начало','Художник','Люк Фриборн') + ,('Начало','Художник','Мэттью Грэй') + ,('Начало','Монтаж','Ли Смит') + ,('Начало','Актер','Леонардо ДиКаприо') + ,('Начало','Актриса','Эллен Пейдж') + ,('Начало','Актер','Джозеф Гордон-Левитт') + ,('Начало','Актер','Том Харди') + ,('Начало','Актер','Кэн Ватанабэ') + ,('Начало','Актер','Дилип Рао') + ,('Начало','Актер','Киллиан Мёрфи') + ,('Начало','Актер','Том Беренджер') + ,('Начало','Актриса','Марион Котийяр') + ,('Начало','Актер','Пит Постлетуэйт')) + + +-- Заполняем временную таблицу 'kinopoisk_data' значениями (Название фильма, тип персоны, ФИО персоны) +INSERT INTO kinopoisk_data(title, person_type, person_fio) + SELECT pd.title, pd.person_type, pd.fio + FROM persons_data pd; + +-- Заполняем таблицу 'persons'. +INSERT INTO persons(fio) + SELECT kd.person_fio + FROM kinopoisk_data kd ON CONFLICT(fio) DO NOTHING; + +-- Заполнение таблицы 'person2person'. +INSERT INTO person2content(film_id, person_id, person_type) + SELECT films.id, persons.id, kd.person_type + FROM kinopoisk_data kd + LEFT JOIN films ON films.title = kd.title + LEFT JOIN persons ON persons.fio = kd.person_fio diff --git a/homeworks/hw2_select.sql b/homeworks/hw2_select.sql new file mode 100644 index 0000000..3135a96 --- /dev/null +++ b/homeworks/hw2_select.sql @@ -0,0 +1,65 @@ +SELECT 'ФИО: Насыбуллин А. А.'; + +-- Запрос №1.1 +SELECT * + FROM movie.ratings + LIMIT 10; + +-- Запрос №1.2 +SELECT * + FROM movie.links + WHERE + imdbid LIKE '%42' + AND movieid > 100 + AND movieid < 1000; + +-- Запрос №2.1 +SELECT imdbid + FROM movie.links + INNER JOIN movie.ratings + ON movie.ratings.movieid = movie.links.movieid + WHERE + movie.ratings.rating = 5 + LIMIT 10; + +-- Запрос №3.1. +SELECT DISTINCT COUNT(*) + FROM movie.links lnk + LEFT JOIN movie.ratings rtg + ON rtg.movieid = lnk.movieid + WHERE rtg.movieid IS NULL; + +-- Запрос №3.2 +SELECT userid, AVG(rating) AS avg_ratings + FROM movie.ratings + GROUP BY userid + HAVING + AVG(rating) > 3.5 + ORDER BY avg_ratings DESC + LIMIT 10; + +-- Запрос №4.1 +SELECT imdbid + FROM movie.links + WHERE + movieid IN ( + SELECT movieid + FROM movie.ratings + GROUP BY movieid + HAVING + AVG(rating) > 3.5 + LIMIT 10 + ); + +-- Запрос №4.2 +WITH user_ratings_more_10 AS ( + SELECT AVG(rating) AS avg_rating + FROM movie.ratings + GROUP BY userid + HAVING + COUNT(rating) > 10 +) + +SELECT AVG(avg_rating) + FROM user_ratings_more_10 + diff --git a/homeworks/hw3_select_partition.sql b/homeworks/hw3_select_partition.sql new file mode 100644 index 0000000..0e64f5b --- /dev/null +++ b/homeworks/hw3_select_partition.sql @@ -0,0 +1,13 @@ +SELECT userid, movieid, + ((rating + - MIN(rating) OVER (PARTITION BY userId)) + /(MAX(rating) OVER (PARTITION BY userId) + - MIN(rating) OVER (PARTITION BY userId))) as normed_rating, + AVG(rating) OVER (PARTITION BY userId) as avg_rating + FROM ( + SELECT DISTINCT userid, movieId, rating + FROM movie.ratings + WHERE userId <> 1 + LIMIT 3000 + ) as sample + ORDER BY userid LIMIT 30; \ No newline at end of file diff --git a/homeworks/hw4_ETL.sql b/homeworks/hw4_ETL.sql new file mode 100644 index 0000000..32a831b --- /dev/null +++ b/homeworks/hw4_ETL.sql @@ -0,0 +1,59 @@ +-- Запрос на удаление создаваемых таблиц, если они уже есть +DROP TABLE IF EXISTS movie.content_genres; +DROP TABLE IF EXISTS movie.top_rated_tags; + +-- Запрос на создание таблицы 'content_genres' +CREATE TABLE movie.content_genres +( + movieid BIGINT, + genre VARCHAR(128) +); + +-- Команда на загрузку данных в таблицу 'content_genres' +\COPY movie.content_genres FROM '/usr/share/data_store/raw_data/genres.csv' DELIMITER ',' CSV HEADER; + +-- Запрос на вывод данных тыблицы 'content_genres' +SELECT * FROM movie.content_genres LIMIT 100; + +-- Запрос 1 +SELECT movieid, avg_rating + FROM ( + SELECT r.movieid, AVG(r.rating) AS avg_rating, COUNT(userid) as count_users + FROM movie.ratings AS r + LEFT JOIN movie.content_genres AS cg ON cg.movieid = r.movieid + WHERE cg.genre IS NOT NULL + GROUP BY r.movieid + ) AS sample + WHERE count_users > 50 + ORDER BY avg_rating DESC, movieid + LIMIT 150; + +-- Запрос на получение временной таблицы +WITH top_rated AS ( + SELECT movieid, avg_rating + FROM ( + SELECT r.movieid, AVG(r.rating) AS avg_rating, COUNT(userid) as count_users + FROM movie.ratings AS r + LEFT JOIN movie.content_genres AS cg ON cg.movieid = r.movieid + WHERE cg.genre IS NOT NULL + GROUP BY r.movieid + ) as sample + WHERE count_users > 50 + ORDER BY avg_rating DESC, movieid + LIMIT 150 +) + +-- Запрос на заполнение таблицы 'top_rated_tags' +SELECT tr.movieid, tr.avg_rating, cg.genre + INTO movie.top_rated_tags + FROM top_rated AS tr + LEFT JOIN movie.content_genres AS cg ON cg.movieid = tr.movieid + ORDER BY tr.avg_rating DESC; + +-- Зарос на вывод данных 'top_rated_tags' +SELECT * FROM movie.top_rated_tags ORDER BY avg_rating DESC; + +-- анды выгрузки данных в csv + +\COPY (SELECT * FROM movie.top_rated_tags) TO '/usr/share/data_store/raw_data/top_rated_tags.csv' WITH CSV HEADER DELIMITER AS E'\t'; + diff --git a/homeworks/hw5_agg.js b/homeworks/hw5_agg.js new file mode 100644 index 0000000..74d345b --- /dev/null +++ b/homeworks/hw5_agg.js @@ -0,0 +1,28 @@ +db.stats() + +use movie + +db.stats() + +// Запрос 1 +db["tags"].count() +db["tags"].aggregate([{ $count: "tsags_count" }]) + +// Запрос 2 +db["tags"].count({ "tag_name": "Adventure" }) +db["tags"].aggregate([{ $match: { "tag_name": "Adventure" } }, { $count: "adventure_count" }]) + +// Запрос 3 +db["tags"].aggregate([{ $group: {_id: "$tag_name", count: { $sum: 1 } } }, { $sort: { count:-1 } }, { $limit: 3 }]) + + +// Запрос 1 +db.tags.count() +db.tags.aggregate([{ $count: "tsags_count" }]) + +// Запрос 2 +db.tags.count({ "tag_name": "Adventure" }) +db.tags.aggregate([{ $match: { "tag_name": "Adventure" } }, { $count: "adventure_count" }]) + +// Запрос 3 +db.tags.aggregate([{ $group: {_id: "$tag_name", count: { $sum: 1 } } }, { $sort: { count:-1 } }, { $limit: 3 }])