Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file added 1
Empty file.
1 change: 1 addition & 0 deletions docker_compose/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
180 changes: 180 additions & 0 deletions homeworks/hw1_db-initialize.sql
Original file line number Diff line number Diff line change
@@ -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
65 changes: 65 additions & 0 deletions homeworks/hw2_select.sql
Original file line number Diff line number Diff line change
@@ -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

13 changes: 13 additions & 0 deletions homeworks/hw3_select_partition.sql
Original file line number Diff line number Diff line change
@@ -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;
59 changes: 59 additions & 0 deletions homeworks/hw4_ETL.sql
Original file line number Diff line number Diff line change
@@ -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';

28 changes: 28 additions & 0 deletions homeworks/hw5_agg.js
Original file line number Diff line number Diff line change
@@ -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 }])