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
103 changes: 103 additions & 0 deletions HomeWork_Lesson-10.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
-- Провести аналитику в разрезе групп.

-- Построить запрос, который будет выводить следующие столбцы:

-- имя группы
-- среднее количество пользователей в группах
-- самый молодой пользователь в группе
-- самый пожилой пользователь в группе
-- количество пользователей в группе
-- всего пользователей в системе
-- отношение в процентах (количество пользователей в группе / всего пользователей в системе) * 100

SELECT DISTINCT
communities.name AS group_name,
COUNT(communities_users.user_id) OVER()
/ (SELECT COUNT(*) FROM communities) AS avg_users_in_groups,
FIRST_VALUE(users.id)
OVER(PARTITION BY communities.id ORDER BY profiles.birthday DESC) AS youngest,
FIRST_VALUE(users.id)
OVER(PARTITION BY communities.id ORDER BY profiles.birthday) AS oldest,
COUNT(communities_users.user_id)
OVER(PARTITION BY communities.id) AS users_in_groups,
COUNT(users.id) OVER() AS users_total,
COUNT(communities_users.user_id) OVER(PARTITION BY communities.id)
/ COUNT(users.id) OVER() *100 AS '%%'
FROM communities
JOIN communities_users
ON communities_users.community_id = communities.id
JOIN users
ON communities_users.user_id = users.id
JOIN profiles
ON profiles.user_id = users.id;

SELECT DISTINCT
communities.name AS group_name,
COUNT(communities_users.user_id) OVER()
/ (SELECT COUNT(*) FROM communities) AS avg_users_in_groups,
FIRST_VALUE(users.first_name)
OVER(PARTITION BY communities.id ORDER BY profiles.birthday DESC) AS youngest_first_name,
FIRST_VALUE(users.last_name)
OVER(PARTITION BY communities.id ORDER BY profiles.birthday DESC) AS youngest_last_name,
FIRST_VALUE(users.first_name)
OVER(PARTITION BY communities.id ORDER BY profiles.birthday) AS oldest_first_name,
FIRST_VALUE(users.last_name)
OVER(PARTITION BY communities.id ORDER BY profiles.birthday) AS oldest_last_name,
COUNT(communities_users.user_id)
OVER(PARTITION BY communities.id) AS users_in_groups,
COUNT(users.id) OVER() AS users_total,
COUNT(communities_users.user_id) OVER(PARTITION BY communities.id)
/ COUNT(users.id) OVER() *100 AS '%%'
FROM communities
JOIN communities_users
ON communities_users.community_id = communities.id
JOIN users
ON communities_users.user_id = users.id
JOIN profiles
ON profiles.user_id = users.id;

SELECT DISTINCT
communities.name AS group_name,
COUNT(communities_users.user_id) OVER()
/ (SELECT COUNT(*) FROM communities) AS avg_users_in_groups,
FIRST_VALUE(users.first_name)
OVER birthday_desc AS youngest_first_name,
FIRST_VALUE(users.last_name)
OVER birthday_desc AS youngest_last_name,
FIRST_VALUE(users.first_name)
OVER birthday_asc AS oldest_first_name,
FIRST_VALUE(users.last_name)
OVER birthday_asc AS oldest_last_name,
COUNT(communities_users.user_id)
OVER(PARTITION BY communities.id) AS users_in_groups,
COUNT(users.id) OVER() AS users_total,
COUNT(communities_users.user_id) OVER(PARTITION BY communities.id)
/ COUNT(users.id) OVER() *100 AS '%%'
FROM communities
JOIN communities_users
ON communities_users.community_id = communities.id
JOIN users
ON communities_users.user_id = users.id
JOIN profiles
ON profiles.user_id = users.id
WINDOW birthday_desc AS (PARTITION BY communities.id ORDER BY profiles.birthday DESC),
birthday_asc AS (PARTITION BY communities.id ORDER BY profiles.birthday);


SELECT
ROW_NUMBER() OVER w AS 'row_number',
from_user_id,
created_at,
LEAD(created_at) OVER w AS 'LEAD',
LAG(created_at) OVER w AS 'LAG'
FROM messages
WINDOW w AS (PARTITION BY (from_user_id) ORDER BY created_at);

SELECT
ROW_NUMBER() OVER w AS 'row_number',
from_user_id,
created_at,
LAG(created_at) OVER w AS 'LAG',
TIMESTAMPDIFF(SECOND, LAG(created_at) OVER w, created_at) AS difference
FROM messages
WINDOW w AS (PARTITION BY (from_user_id) ORDER BY created_at);
93 changes: 93 additions & 0 deletions Lesson-11.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
-- Создайте таблицу logs типа Archive. Пусть при каждом создании записи в таблицах users,
-- catalogs и products в таблицу logs помещается время и дата создания записи, название
-- таблицы, идентификатор первичного ключа и содержимое поля name.

CREATE TABLE Logs (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
created_at datetime DEFAULT CURRENT_TIMESTAMP,
table_name varchar(50) NOT NULL,
row_id INT UNSIGNED NOT NULL,
row_name varchar(255)
) ENGINE = Archive;

DELIMITER //

CREATE TRIGGER products_insert AFTER INSERT ON products
FOR EACH ROW
BEGIN
INSERT INTO Logs VALUES (NULL, DEFAULT, "products", NEW.id, NEW.name);
END//

CREATE TRIGGER users_insert AFTER INSERT ON users
FOR EACH ROW
BEGIN
INSERT INTO Logs VALUES (NULL, DEFAULT, "users", NEW.id, NEW.first_name);
END//

CREATE TRIGGER catalogs_insert AFTER INSERT ON catalogs
FOR EACH ROW
BEGIN
INSERT INTO Logs VALUES (NULL, DEFAULT, "catalogs", NEW.id, NEW.name);
END//

DELIMITER ;



-- В базе данных Redis подберите коллекцию для подсчета посещений с определенных IP-адресов.

HINCRBY addresses '127.0.0.1' 1
HGETALL addresses

HINCRBY addresses '127.0.0.2' 1
HGETALL addresses

HGET addresses '127.0.0.1'




-- Организуйте хранение категорий и товарных позиций учебной базы данных shop в СУБД MongoDB.


show dbs

use shop

db.createCollection('catalogs')
db.createCollection('products')

db.catalogs.insert({name: 'Процессоры'})
db.catalogs.insert({name: 'Мат.платы'})
db.catalogs.insert({name: 'Видеокарты'})

db.products.insert(
{
name: 'Intel Core i3-8100',
description: 'Процессор для настольных персональных компьютеров, основанных на платформе Intel.',
price: 7890.00,
catalog_id: new ObjectId("5b56c73f88f700498cbdc56b")
}
);

db.products.insert(
{
name: 'Intel Core i5-7400',
description: 'Процессор для настольных персональных компьютеров, основанных на платформе Intel.',
price: 12700.00,
catalog_id: new ObjectId("5b56c73f88f700498cbdc56b")
}
);

db.products.insert(
{
name: 'ASUS ROG MAXIMUS X HERO',
description: 'Материнская плата ASUS ROG MAXIMUS X HERO, Z370, Socket 1151-V2, DDR4, ATX',
price: 19310.00,
catalog_id: new ObjectId("5b56c74788f700498cbdc56c")
}
);

db.products.find()

db.products.find({catalog_id: ObjectId("5b56c73f88f700498cbdc56bdb")})
Loading