diff --git a/Week1/.DS_Store b/Week1/.DS_Store index 9411341..b9a9985 100644 Binary files a/Week1/.DS_Store and b/Week1/.DS_Store differ diff --git a/Week1/solutions/myscript.sh b/Week1/solutions/myscript.sh new file mode 100755 index 0000000..08ac279 --- /dev/null +++ b/Week1/solutions/myscript.sh @@ -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 diff --git a/Week3/.DS_Store b/Week3/.DS_Store new file mode 100644 index 0000000..15a3dc0 Binary files /dev/null and b/Week3/.DS_Store differ diff --git a/Week3/solutions/.DS_Store b/Week3/solutions/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Week3/solutions/.DS_Store differ diff --git a/Week3/solutions/hw2_task1.sql b/Week3/solutions/hw2_task1.sql new file mode 100644 index 0000000..0dd04f1 --- /dev/null +++ b/Week3/solutions/hw2_task1.sql @@ -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; diff --git a/Week3/solutions/hw2_task10.sql b/Week3/solutions/hw2_task10.sql new file mode 100644 index 0000000..168f10f --- /dev/null +++ b/Week3/solutions/hw2_task10.sql @@ -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 diff --git a/Week3/solutions/hw2_task2.sql b/Week3/solutions/hw2_task2.sql new file mode 100644 index 0000000..55c7ea3 --- /dev/null +++ b/Week3/solutions/hw2_task2.sql @@ -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; diff --git a/Week3/solutions/hw2_task3.sql b/Week3/solutions/hw2_task3.sql new file mode 100644 index 0000000..cf49dbb --- /dev/null +++ b/Week3/solutions/hw2_task3.sql @@ -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); + \ No newline at end of file diff --git a/Week3/solutions/hw2_task4.sql b/Week3/solutions/hw2_task4.sql new file mode 100644 index 0000000..575f94a --- /dev/null +++ b/Week3/solutions/hw2_task4.sql @@ -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; diff --git a/Week3/solutions/hw2_task5.sql b/Week3/solutions/hw2_task5.sql new file mode 100644 index 0000000..580c37b --- /dev/null +++ b/Week3/solutions/hw2_task5.sql @@ -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; diff --git a/Week3/solutions/hw2_task6.sql b/Week3/solutions/hw2_task6.sql new file mode 100644 index 0000000..9a06b35 --- /dev/null +++ b/Week3/solutions/hw2_task6.sql @@ -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; diff --git a/Week3/solutions/hw2_task7.sql b/Week3/solutions/hw2_task7.sql new file mode 100644 index 0000000..1c88d91 --- /dev/null +++ b/Week3/solutions/hw2_task7.sql @@ -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 diff --git a/Week3/solutions/hw2_task8.sql b/Week3/solutions/hw2_task8.sql new file mode 100644 index 0000000..e88b478 --- /dev/null +++ b/Week3/solutions/hw2_task8.sql @@ -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 diff --git a/Week3/solutions/hw2_task9.sql b/Week3/solutions/hw2_task9.sql new file mode 100644 index 0000000..b5c91a7 --- /dev/null +++ b/Week3/solutions/hw2_task9.sql @@ -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; + \ No newline at end of file