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
Binary file modified Week1/.DS_Store
Binary file not shown.
65 changes: 65 additions & 0 deletions Week1/solutions/myscript.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#!/bin/bash
echo "Welcome to the DaveCoffeeshop!"

if [ -f "$HOME"/davecoffeeshop.db ]
then
echo "$HOME/davecoffeeshop.db, using existing database"
else
echo "$HOME/davecoffeeshop.db missing => creating new file"
touch "$HOME/davecoffeeshop.db"
fi
echo "To log order, enter LOG"
echo "To end session, enter EOS"
echo "To end business day, enter EOD"

flag=$(( 0 ))
LOG="LOG"
EOD="EOD"
EOS="EOS"

while [ $flag -lt 1 ]
do
read -r str
if [ "$str" = "$LOG" ]
then
echo -n "Barista name: "
read -r name
echo -n "Drinking: "
read -r drink
if [ "$drink" = "RAF" ]
then
echo "$name;$drink;200" >> "$HOME"/davecoffeeshop.db
echo "Order was saved!"
elif [ "$drink" = "CAP" ]
then
echo "$name;$drink;150" >> "$HOME"/davecoffeeshop.db
echo "Order was saved!"
elif [ "$drink" = "AME" ]
then
echo "$name;$drink;100" >> "$HOME"/davecoffeeshop.db
echo "Order was saved!"
elif [ "$drink" = "ESP" ]
then
echo "$name;$drink;120" >> "$HOME"/davecoffeeshop.db
echo "Order was saved!"
elif [ "$drink" = "LAT" ]
then
echo "$name;$drink;170" >> "$HOME"/davecoffeeshop.db
echo "Order was saved!"
fi
elif [ "$str" = "$EOS" ]
then
flag+=1
echo "End of session"
elif [ "$str" = "$EOD" ]
then
echo "End of day. Result:"
awk -F ";" '{
array[$1]+=$3;
} END {
for (i in array)
print i";"array[i]}' "$HOME"/davecoffeeshop.db | sort -t ";" -k2 -n -r
else
echo "Bad command. Try again"
fi
done
Binary file added Week3/.DS_Store
Binary file not shown.
Binary file added Week3/solutions/.DS_Store
Binary file not shown.
9 changes: 9 additions & 0 deletions Week3/solutions/hw2_task1.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
-- Задание 1. Вывести все альбомы со средней длинной трека, большей 250 секунд.
-- Вывести название альбома и количество треков.
-- (album_name, cnt).

select distinct title as album_name, count(t.album_id) as cnt
from album
join track t on album.album_id = t.album_id
group by title
having AVG(t.milliseconds) > 250000;
32 changes: 32 additions & 0 deletions Week3/solutions/hw2_task10.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
--Задание 10. Для каждого альбома тип медиа определяется как наибольшая суммарный размер треков по жанру.
-- Для каждого исполнителя вывести тип медиа, соответствующий наибольшему количеству типов медиа по альбомам,
-- где они участвуют. Вывести имя исполнителя, тип медиа, количество альбомов с данными типом,
-- общее количество альбомов.
-- (artist_name, media_type_name, media_cnt, whole_cnt)

with Media_type_Media_cnt as (select media_type.name as med_type, count(distinct t.album_id) as media_cnt
from media_type
join track t on media_type.media_type_id = t.media_type_id
join album a on a.album_id = t.album_id
where a.title is not null
group by media_type.name)
select Artist_name_Cnt_a_t_Media_type.artist_name as artist_name,
Artist_name_Cnt_a_t_Media_type.media_type as media_type,
m_t_m_c.media_cnt as media_cnt,
(select count(*) from album) as whole_cnt
from (select distinct on (a2.name) a2.name as artist_name,
count(distinct a.title) as a_t,
Album_name_Sum_bytes_Media_type.m_t as media_type
from (select distinct on (album.title) album.title as a_t, sum(t.bytes) as sum_b, mt.name as m_t
from album
join track t on album.album_id = t.album_id
join media_type mt on t.media_type_id = mt.media_type_id
join artist a on a.artist_id = album.artist_id
group by album.title, mt.name
order by album.title, sum_b DESC) as Album_name_Sum_bytes_Media_type
join album a on a.title = a_t
join track t on a.album_id = t.album_id
join artist a2 on a2.artist_id = a.artist_id
group by a2.name, Album_name_Sum_bytes_Media_type.m_t
order by a2.name, a_t DESC) as Artist_name_Cnt_a_t_Media_type
join Media_type_Media_cnt m_t_m_c on m_t_m_c.med_type = Artist_name_Cnt_a_t_Media_type.media_type
9 changes: 9 additions & 0 deletions Week3/solutions/hw2_task2.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
-- Задание 2. Для каждого набора жанр, тип медиа вывести количество треков.
-- Если для набора жанр, тип медиа треков нет, то такой набор выводить не требуется.
-- (genre_name, media_type_name, cnt)

select genre.name as genre_name, mt.name as media_type_name, count(t.name) as cnt
from genre
join track t on genre.genre_id = t.genre_id
join media_type mt on t.media_type_id = mt.media_type_id
group by genre.name, mt.name;
17 changes: 17 additions & 0 deletions Week3/solutions/hw2_task3.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
-- Задание 3. Вывести сотрудников, которые старше своего менеджера, но были наняты позже своего менеджера.
-- Вывести полное имя сотрудника(Фамилия<Пробел>Имя), день рождения, дата найма, полное имя менеджера, день рождения,
-- дата найма.
-- (employee_full_name, employee_birth_date, employee_hire_date, manager_full_name, manager_birth_date, manager_hire_date)

select employee.last_name || ' ' || employee.first_name as employee_full_name,
employee.birth_date as employee_birth_date,
employee.hire_date as employee_hire_date,
manager.last_name || ' ' || manager.first_name as manager_full_name,
manager.birth_date as manager_birth_date,
manager.hire_date as manager_hire_date

from employee
join employee as manager on manager.employee_id = employee.reports_to
where (manager.birth_date < employee.birth_date)
AND (manager.hire_date < employee.hire_date);

13 changes: 13 additions & 0 deletions Week3/solutions/hw2_task4.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
--Задание 4. Для всех треков жанра Rock и Metal, для каждого артиста подсчитать количество треков.
-- Вывести имя артиста, количество треков.
-- (artist_name, qty)


select art.name as artist_name, count(track.name) as qty
from track
join genre g on g.genre_id = track.genre_id
join album alb on alb.album_id = track.album_id
join artist art on art.artist_id = alb.artist_id
where (g.name = 'Rock')
Or (g.name = 'Metal')
group by art.name;
14 changes: 14 additions & 0 deletions Week3/solutions/hw2_task5.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
--Задание 5. Для каждого сотрудника подсчитать количество клиентов, количестов выполненных заказов,
-- количество уникальных адресов доставки и общее число приобретенных треков и вывести полное имя сотрудника.
-- (employee_full_name, invoices_count, customers_count, addresses_count, tracks_count)

select (employee.first_name || ' ' || employee.last_name) as employee_full_name,
count(distinct i.invoice_id) as invoice_count,
count(distinct cust.last_name) as customers_count,
count(distinct i.billing_address) as addresses_count,
sum(il.quantity) as tracks_count
from employee
join customer cust on employee.employee_id = cust.support_rep_id
join invoice i on cust.customer_id = i.customer_id
join invoice_line il on i.invoice_id = il.invoice_id
group by employee_full_name;
25 changes: 25 additions & 0 deletions Week3/solutions/hw2_task6.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
--Задание 6. Выполнить сегментацию клиентов по количеству букв а в его фамилии - Группа 'A' - 0 букв, 'B' - 1 буква,
-- 'C' - 2 буквы, 'D' - 3 и более букв.
-- Для каждой группы вывести количество уникальных типов медиа,
-- купленных клиентами по трекам из различных жанров метала.
-- Вывести имя группы и количество уникальных типов медиа (segment_group, cnt)

select distinct CASE
when (SELECT length(customer.last_name) - length(REPLACE(lower(customer.last_name), 'a', '')) = 0)
then 'A'
when (SELECT length(customer.last_name) - length(REPLACE(lower(customer.last_name), 'a', '')) = 1)
then 'B'
when (SELECT length(customer.last_name) - length(REPLACE(lower(customer.last_name), 'a', '')) = 2)
then 'C'
when (SELECT length(customer.last_name) - length(REPLACE(lower(customer.last_name), 'a', '')) >= 3)
then 'D'
end as segment_group,
count(distinct mt.name) as cnt
from customer
join invoice i on customer.customer_id = i.customer_id
join invoice_line il on i.invoice_id = il.invoice_id
join track t on il.track_id = t.track_id
join genre g on t.genre_id = g.genre_id
join media_type mt on mt.media_type_id = t.media_type_id
where g.name like '%Metal'
group by customer.last_name;
31 changes: 31 additions & 0 deletions Week3/solutions/hw2_task7.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
--Задание 7. Вывести компании, которые приобрели больше всех композиций по каждому из жанров.
-- При этом указать самую популярную композицию по жанру у данной компании.
-- (популярность определяется по количеству покупок)
-- (company_name, track_name)


with table_1 as (select distinct on (genre.name) genre.name as name, c.company, sum(il.quantity) as sum
from genre
join track t on genre.genre_id = t.genre_id
join invoice_line il on t.track_id = il.track_id
join invoice i on i.invoice_id = il.invoice_id
join customer c on c.customer_id = i.customer_id
where c.company is not null
group by genre.name, c.company
order by genre.name, sum desc, c.company),
table_2 as (
select c.company, g.name as name, track.name as track, sum(il.quantity) as sum
from track
join genre g on g.genre_id = track.genre_id
join invoice_line il on track.track_id = il.track_id
join invoice i on i.invoice_id = il.invoice_id
join customer c on c.customer_id = i.customer_id
where c.company is not null
group by c.company, g.name, track.name
order by c.company, sum desc, c.company)
select table_3.company, table_3.track from (select distinct on (table_1.name) table_1.company, table_1.name, t_2.track
from table_1
join table_2 t_2 on t_2.name = table_1.name
where table_1.company = t_2.company
and t_2.name = table_1.name
order by table_1.name,table_1.company, t_2.track) as table_3
33 changes: 33 additions & 0 deletions Week3/solutions/hw2_task8.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
--Задание 8. Вывести треки по каждому жанру, которые входять в самые популярные 25% с точки зрения количества покупок.
-- Если у нескольких треков одиннаковоко количество приобретенных композиций,
-- популярность определяется в лексикографическом порядке
-- (Например, трек, начинающийся с 'A' будет более популярен, чем трек, начинающийся с 'B').
-- Для каждого трека указать популярность в процентах от общего количества покупок по жанру.
-- (track_name, popularity)
with table_1 as (select genre.name as genre_name,
sum(i.quantity) as sum_buy_genre
from genre
join track t on genre.genre_id = t.genre_id
join invoice_line i on t.track_id = i.track_id
group by genre.name),
table_2 as (
select g.name as genre_name,
t.name as track_name,
sum(il.quantity) as sum_buy,
100.0 * sum(il.quantity) / table_1.sum_buy_genre as popularity,
row_number() over (partition by g.name order by g.name, t.name) as track_pos
from table_1
join genre g on g.name = table_1.genre_name
join track t on g.genre_id = t.genre_id
join invoice_line il on t.track_id = il.track_id
group by g.name, t.name, table_1.sum_buy_genre
order by g.name, t.name),
table_3 as (select table_2.track_name as track_name,
table_2.genre_name as genre_name,
sum(t_2_2.popularity) as buf
from table_2
join table_2 t_2_2 on t_2_2.genre_name = table_2.genre_name and table_2.track_pos >= t_2_2.track_pos
group by table_2.track_name, table_2.genre_name)
select table_3.track_name, t_2.popularity from table_3
join table_2 t_2 on t_2.track_name = table_3.track_name
where buf <=25
22 changes: 22 additions & 0 deletions Week3/solutions/hw2_task9.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
--Задание 9. Для каждого альбома жанр определяется как наибольшая суммарная продолжительность треков по жанру.
-- Вывести альбом, жанр, и общее количество купленных песен по нему.
-- (album_name, genre_name, cnt)


with first_table as (select distinct on (album.title) album.title as a_n,
sum(t.milliseconds) as s_t,
g.name as g_n
from album
join track t on album.album_id = t.album_id
join genre g on t.genre_id = g.genre_id
group by album.title, g.name
order by album.title, s_t desc),
second_table as (select album.title, count(il.quantity) as num
from album
join track t on album.album_id = t.album_id
join invoice_line il on t.track_id = il.track_id
group by album.title)
select first_table.a_n as album_name, first_table.g_n as genre_name, s_t.num
from first_table
join second_table s_t on s_t.title = first_table.a_n;