diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..c13239c Binary files /dev/null and b/.DS_Store differ diff --git a/Week1/.DS_Store b/Week1/.DS_Store index 9411341..f8b0039 100644 Binary files a/Week1/.DS_Store and b/Week1/.DS_Store differ diff --git a/Week1/solutions/.DS_Store b/Week1/solutions/.DS_Store new file mode 100644 index 0000000..18a4cfd Binary files /dev/null and b/Week1/solutions/.DS_Store differ diff --git a/Week1/solutions/hw1_dorzhiev_ardan/coffeshop.sh b/Week1/solutions/hw1_dorzhiev_ardan/coffeshop.sh new file mode 100644 index 0000000..a4a5efe --- /dev/null +++ b/Week1/solutions/hw1_dorzhiev_ardan/coffeshop.sh @@ -0,0 +1,67 @@ +echo 'Welcome to the Dave Coffeeshop!' + +if [ -f davecoffeeshop.db ]; then + echo 'davecoffeeshop.db exists, using existing database' +else + echo 'davecoffeeshop.db not exists => creating db file' + touch davecoffeeshop.db + + echo 'success' +fi + +echo 'To log order, enter LOG +To end session, enter EOS +To end business day, enter EOD' + +while read command + do + if [ $command = 'LOG' ]; then + echo 'Enter Barista' + read barista + echo 'Enter Drink' + read in_drink + echo "Barista name: $barista" + echo "Drinking: $in_drink" + + case $in_drink in + "AME") + price=100 + ;; + "ESP") + price=120 + ;; + "CAP") + price=150 + ;; + "LAT") + price=170 + ;; + "RAF") + price=200 + ;; + *) + price=0 + ;; + esac + + if (( price > 0 )); then + echo "$barista;$in_drink;$price" >> davecoffeeshop.db + echo 'Order was saved!' + else + echo Invalid drink c, ignoring + fi + + elif [ $command = 'EOS' ]; then + echo 'End of Session' + exit + elif [ $command = 'EOD' ]; then + echo 'End of Day!' + + cat davecoffeeshop.db | sort -nk1 -t ";" | awk -F";" 'BEGIN {OFS=";" }\ + ($1 == last || last == "") {sum += $3} ($1 != last && last != "")\ + {print last, sum; sum = $3} {last = $1} END {print last, sum}' | sort -nrk2 -t ";" + + else + echo 'WRONG COMMAND. USE ONLY LOG, EOD, EOS' + fi +done diff --git a/Week1/solutions/hw1_dorzhiev_ardan/davecoffeeshop.db b/Week1/solutions/hw1_dorzhiev_ardan/davecoffeeshop.db new file mode 100644 index 0000000..6712c05 --- /dev/null +++ b/Week1/solutions/hw1_dorzhiev_ardan/davecoffeeshop.db @@ -0,0 +1,4 @@ +ARDAN;AME;100 +MARIE;RAF;200 +ARDAN;CAP;150 +MARIE;LAT;170 diff --git "a/Week1/solutions/hw1_dorzhiev_ardan/\320\222\321\213\320\262\320\276\320\264 \321\202\320\265\321\200\320\274\320\270\320\275\320\260\320\273\320\260 DaveCoffeeShop" "b/Week1/solutions/hw1_dorzhiev_ardan/\320\222\321\213\320\262\320\276\320\264 \321\202\320\265\321\200\320\274\320\270\320\275\320\260\320\273\320\260 DaveCoffeeShop" new file mode 100644 index 0000000..8dd2e0f --- /dev/null +++ "b/Week1/solutions/hw1_dorzhiev_ardan/\320\222\321\213\320\262\320\276\320\264 \321\202\320\265\321\200\320\274\320\270\320\275\320\260\320\273\320\260 DaveCoffeeShop" @@ -0,0 +1,59 @@ +(base) MacBook-Air-Ardan:~ ardandorzhiev$ sh ./coffeshop.sh +Welcome to the Dave Coffeeshop! +davecoffeeshop.db not exists => creating db file +success +To log order, enter LOG +To end session, enter EOS +To end business day, enter EOD +LOG +Enter Barista +ARDAN +Enter Drink +AME +Barista name: ARDAN +Drinking: AME +Order was saved! +LOG +Enter Barista +MARIE +Enter Drink +RAF +Barista name: MARIE +Drinking: RAF +Order was saved! +LOG +Enter Barista +ARDAN +Enter Drink +CAP +Barista name: ARDAN +Drinking: CAP +Order was saved! +LOG +Enter Barista +NICK +Enter Drink +COLA +Barista name: NICK +Drinking: COLA +Invalid drink c, ignoring +LOG +Enter Barista +MARIE +Enter Drink +LAT +Barista name: MARIE +Drinking: LAT +Order was saved! +EOD +End of Day! +MARIE;370 +ARDAN;250 +EOS +End of Session +(base) MacBook-Air-Ardan:~ ardandorzhiev$ cat davecoffeeshop.db +ARDAN;AME;100 +MARIE;RAF;200 +ARDAN;CAP;150 +MARIE;LAT;170 +(base) MacBook-Air-Ardan:~ ardandorzhiev$ diff --git a/Week3/.DS_Store b/Week3/.DS_Store new file mode 100644 index 0000000..66cda8f 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..43dab89 Binary files /dev/null and b/Week3/solutions/.DS_Store differ diff --git a/Week3/solutions/hw2_dorzhiev_ardan/hw2_task1.sql b/Week3/solutions/hw2_dorzhiev_ardan/hw2_task1.sql new file mode 100644 index 0000000..a7af359 --- /dev/null +++ b/Week3/solutions/hw2_dorzhiev_ardan/hw2_task1.sql @@ -0,0 +1,24 @@ +/* Вывести все альбомы со средней длинной трека, большей 250 секунд. + * Вывести название альбома и количество треков. (album_name, cnt).*/ + + +with album_track_length as (select a.album_id + , a.title as album_name + , round(avg(t.milliseconds)/1000,0) avg_track_length_in_seconds + from album a + join track t on a.album_id = t.album_id + group by a.album_id + , a.title + having avg(t.milliseconds)/1000 > 250 + order by a.album_id ) + +select a.title as album_name + , count(t.track_id) cnt + from album a + join track t on a.album_id = t.album_id + where exists (select 1 from album_track_length atl where atl.album_id = a.album_id) + group by a.album_id + , a.title + order by a.title + + diff --git a/Week3/solutions/hw2_dorzhiev_ardan/hw2_task10.sql b/Week3/solutions/hw2_dorzhiev_ardan/hw2_task10.sql new file mode 100644 index 0000000..fe6cc33 --- /dev/null +++ b/Week3/solutions/hw2_dorzhiev_ardan/hw2_task10.sql @@ -0,0 +1,76 @@ +/* Для каждого альбома тип медиа определяется как наибольшая суммарный размер треков по жанру. + * Для каждого исполнителя вывести тип медиа, соответствующий наибольшему количеству типов медиа по альбомам, где они участвуют. + * Вывести имя исполнителя, тип медиа, количество альбомов с данными типом, общее количество альбомов. + * + * (artist_name, media_type_name, media_cnt, whole_cnt) + * + * */ + + +with album_agg as (select a.album_id + , t.media_type_id + , sum(t.bytes) size_tracks + from album a + join track t on t.album_id = a.album_id + group by a.album_id + , t.media_type_id + order by a.album_id + ) , + album_media as (select a1.album_id + , a1.media_type_id + from album_agg a1 + join album a on a1.album_id = a.album_id + where (a1.album_id, a1.media_type_id) in (select a2.album_id, a2.media_type_id + from album_agg a2 + where a1.album_id = a2.album_id + and a1.media_type_id = a2.media_type_id + order by a2.size_tracks desc + limit 1 + ) + + + ) , + + artist_albums_media as ( select a.artist_id + , am.media_type_id + , count(distinct al.album_id) cnt_albums + from artist a + join album al on al.album_id = a.artist_id + join album_media am on al.album_id = am.album_id + group by a.artist_id + , am.media_type_id + ) , + + artist_cnt_media as (select ar.artist_id + , m.media_type_id + , count(distinct a.album_id) cnt_media_albums + from album a + join album_media m on a.album_id = m.album_id + join artist ar on a.artist_id = ar.artist_id + group by ar.artist_id + , m.media_type_id + ) , + + artist_cnt_albums as (select ar.artist_id + , count(distinct a.album_id) cnt_albums + from album a + join artist ar on a.artist_id = ar.artist_id + group by ar.artist_id + ) + + + select a."name" as artist_name + , mt."name" as media_type_name + , acm.cnt_media_albums as media_cnt + , aca.cnt_albums as whole_cnt + from artist_albums_media am + join artist_cnt_media acm on am.artist_id = acm.artist_id + join artist_cnt_albums aca on am.artist_id = aca.artist_id + join artist a on am.artist_id = a.artist_id + join media_type mt on am.media_type_id = mt.media_type_id + where am.cnt_albums in (select max(am1.cnt_albums) c + from artist_albums_media am1 + where am1.artist_id = am.artist_id) + + + \ No newline at end of file diff --git a/Week3/solutions/hw2_dorzhiev_ardan/hw2_task2.sql b/Week3/solutions/hw2_dorzhiev_ardan/hw2_task2.sql new file mode 100644 index 0000000..bc1090a --- /dev/null +++ b/Week3/solutions/hw2_dorzhiev_ardan/hw2_task2.sql @@ -0,0 +1,17 @@ +/* Для каждого набора жанр, тип медиа вывести количество треков. + * Если для набора жанр, тип медиа треков нет, то такой набор выводить не требуется. + * (genre_name, media_type_name, cnt) + */ + + select g."name" as genre_name + , mt."name" as media_type_name + , count(t.track_id) as cnt_tracks + from track t + join media_type mt on t.media_type_id = mt.media_type_id + join genre g on t.genre_id = g.genre_id +group by g.genre_id + , g."name" + , mt.media_type_id + , mt."name" + having count(t.track_id) > 0 +order by g."name" \ No newline at end of file diff --git a/Week3/solutions/hw2_dorzhiev_ardan/hw2_task3.sql b/Week3/solutions/hw2_dorzhiev_ardan/hw2_task3.sql new file mode 100644 index 0000000..90cd460 --- /dev/null +++ b/Week3/solutions/hw2_dorzhiev_ardan/hw2_task3.sql @@ -0,0 +1,16 @@ +/* Вывести сотрудников, которые старше своего менеджера, но были наняты позже своего менеджера. + * Вывести полное имя сотрудника(Фамилия<Пробел>Имя), день рождения, дата найма, полное имя менеджера, день рождения, дата найма. + * (employee_full_name, employee_birth_date, employee_hire_date, manager_full_name, manager_birth_date, manager_hire_date) + */ + + select concat(e.last_name, ' ', e.first_name) as employee_full_name + , e.birth_date as employee_birth_date + , e.hire_date as employee_hire_date + , concat(m.last_name, ' ', m.first_name) as manager_full_name + , m.birth_date as manager_birth_date + , m.hire_date as manager_hire_date + from employee e + join employee m on e.reports_to = m.employee_id + where e.birth_date < m.birth_date -- работник старше своего менеджера + and e.hire_date > m.hire_date -- работник нанят позже менеджера + \ No newline at end of file diff --git a/Week3/solutions/hw2_dorzhiev_ardan/hw2_task4.sql b/Week3/solutions/hw2_dorzhiev_ardan/hw2_task4.sql new file mode 100644 index 0000000..02dca42 --- /dev/null +++ b/Week3/solutions/hw2_dorzhiev_ardan/hw2_task4.sql @@ -0,0 +1,28 @@ +/* Для всех треков жанра Rock и Metal, для каждого артиста подсчитать количество треков. + * Вывести имя артиста, количество треков. (artist_name, qty) + */ + + select ar."name" as artist_name + , count(t.track_id) as qty + from track t + join genre g on t.genre_id = g.genre_id + join album a on t.album_id = a.album_id + join artist ar on a.artist_id = ar.artist_id + where g."name" in ('Rock', 'Metal') + group by ar.artist_id + , ar."name" + order by count(t.track_id) + + /*select ar."name" + , g."name" + , t.track_id + , t."name" + , a.album_id + , a.title + from track t + join genre g on t.genre_id = g.genre_id + join album a on t.album_id = a.album_id + join artist ar on a.artist_id = ar.artist_id + where g."name" in ('Rock', 'Metal') + order by ar."name", t.track_id + */ \ No newline at end of file diff --git a/Week3/solutions/hw2_dorzhiev_ardan/hw2_task5.sql b/Week3/solutions/hw2_dorzhiev_ardan/hw2_task5.sql new file mode 100644 index 0000000..f2c2b39 --- /dev/null +++ b/Week3/solutions/hw2_dorzhiev_ardan/hw2_task5.sql @@ -0,0 +1,42 @@ +/* Для каждого сотрудника + * подсчитать количество клиентов, + * количество выполненных заказов, + * количество уникальных адресов доставки + * общее число приобретенных треков + * вывести полное имя сотрудника. + * (employee_full_name, invoices_count, customers_count, addresses_count, tracks_count) + */ + + select concat(e.last_name, ' ', e.first_name) as employee_full_name + , count(distinct c.customer_id) as customers_count + , count(distinct i.invoice_id) as invoices_count + , count(distinct i.billing_address) as addresses_count + , count(iline.track_id) as tracks_count + from employee e + left join customer c on e.employee_id = c.support_rep_id + left join invoice i on i.customer_id = c.customer_id + left join invoice_line iline on i.invoice_id = iline.invoice_id + group by e.employee_id + , concat(e.last_name, ' ', e.first_name) + + /* + select * + from invoice i + left join invoice_line iline on i.invoice_id = iline.invoice_id + + select e.employee_id + , e.title + , concat(e.last_name, ' ', e.first_name) as employee_full_name + , c.customer_id + , i.invoice_id + , i.billing_address + , iline.track_id + from employee e + left join customer c on e.employee_id = c.support_rep_id + left join invoice i on i.customer_id = c.customer_id + left join invoice_line iline on i.invoice_id = iline.invoice_id + order by e.employee_id */ + + + + \ No newline at end of file diff --git a/Week3/solutions/hw2_dorzhiev_ardan/hw2_task6.sql b/Week3/solutions/hw2_dorzhiev_ardan/hw2_task6.sql new file mode 100644 index 0000000..0b78e7c --- /dev/null +++ b/Week3/solutions/hw2_dorzhiev_ardan/hw2_task6.sql @@ -0,0 +1,51 @@ +/* Выполнить сегментацию клиентов по количеству букв "а" в его фамилии - Группа 'A' - 0 букв, 'B' - 1 буква, 'C' - 2 буквы, 'D' - 3 и более букв. + * Для каждой группы вывести количество уникальных типов медиа, купленных клиентами по трекам из различных жанров метала. + * Вывести имя группы и количество уникальных типов медиа (segment_group, cnt) + * */ + + select case when LENGTH(c.last_name) - LENGTH(REPLACE(lower(c.last_name), 'a', '')) = 0 then 'A' + when LENGTH(c.last_name) - LENGTH(REPLACE(lower(c.last_name), 'a', '')) = 1 then 'B' + when LENGTH(c.last_name) - LENGTH(REPLACE(lower(c.last_name), 'a', '')) = 2 then 'C' + when LENGTH(c.last_name) - LENGTH(REPLACE(lower(c.last_name), 'a', '')) = 3 then 'D' + else 'E' end as segment_group + , count(distinct t.media_type_id) as cnt + from customer c + join invoice i on c.customer_id = i.customer_id + join invoice_line il on il.invoice_id = i.invoice_id + join track t on il.track_id = t.track_id + join genre g on g.genre_id = t.genre_id + where lower(g."name") like '%metal%' +group by case when LENGTH(c.last_name) - LENGTH(REPLACE(lower(c.last_name), 'a', '')) = 0 then 'A' + when LENGTH(c.last_name) - LENGTH(REPLACE(lower(c.last_name), 'a', '')) = 1 then 'B' + when LENGTH(c.last_name) - LENGTH(REPLACE(lower(c.last_name), 'a', '')) = 2 then 'C' + when LENGTH(c.last_name) - LENGTH(REPLACE(lower(c.last_name), 'a', '')) = 3 then 'D' + else 'E' end + + /* + select c.last_name + , i.invoice_id + , il.invoice_line_id + , il.track_id + , t.media_type_id + , g.genre_id + from customer c + join invoice i on c.customer_id = i.customer_id + join invoice_line il on il.invoice_id = i.invoice_id + join track t on il.track_id = t.track_id + join genre g on g.genre_id = t.genre_id + where lower(g."name") like '%metal%' + order by c.last_name + + select t.media_type_id + from customer c + join invoice i on c.customer_id = i.customer_id + join invoice_line il on il.invoice_id = i.invoice_id + join track t on il.track_id = t.track_id + join genre g on g.genre_id = t.genre_id + where lower(g."name") like '%metal%' + group by t.media_type_id + + + */ + + \ No newline at end of file diff --git a/Week3/solutions/hw2_dorzhiev_ardan/hw2_task7.sql b/Week3/solutions/hw2_dorzhiev_ardan/hw2_task7.sql new file mode 100644 index 0000000..04ca89a --- /dev/null +++ b/Week3/solutions/hw2_dorzhiev_ardan/hw2_task7.sql @@ -0,0 +1,65 @@ +/* Вывести компании, которые приобрели больше всех композиций по каждому из жанров. + * При этом указать самую популярную композицию по жанру у данной компании. + * (популярность определяется по количеству покупок) (company_name, track_name) + */ + + +with genre_company_cnt_tracks as (-- выведем все заказы с треками, которые купили компании + жанр трека + select t.genre_id + , c.company + , count(il.track_id) cnt_tracks + from customer c + join invoice i on i.customer_id = c.customer_id + join invoice_line il on il.invoice_id = i.invoice_id + join track t on t.track_id = il.track_id + where c.company is not null + group by c.company, t.genre_id + order by t.genre_id, c.company + ) , + genre_company as (select a.genre_id, a.company + from genre_company_cnt_tracks a + where (a.genre_id, a.company) in (select a1.genre_id, a1.company + from genre_company_cnt_tracks a1 + where a1.genre_id = a.genre_id + order by a1.cnt_tracks desc, a1.company asc + limit 1 + ) + ), + company_track_popularity as ( -- треки компании в рамках жанра + select t.genre_id + , c.company + , t.track_id + , t."name" as track_name + , count(il.invoice_line_id) track_popularity + from customer c + join invoice i on i.customer_id = c.customer_id + join invoice_line il on il.invoice_id = i.invoice_id + join track t on t.track_id = il.track_id + join genre_company gc on t.genre_id = gc.genre_id and c.company = gc.company + group by t.genre_id + , c.company + , t.track_id + , t."name") + + select -- ctp.genre_id, -- для проверки + ctp.company, ctp.track_name as top_track_name + from company_track_popularity ctp + where (ctp.genre_id, ctp.company, ctp.track_name) in (select ctp1.genre_id, ctp1.company, ctp1.track_name + from company_track_popularity ctp1 + where ctp1.genre_id = ctp.genre_id + and ctp1.company = ctp.company + order by ctp1.track_popularity desc, ctp1.track_name asc + limit 1 + ) + order by -- ctp.genre_id, -- для проверки + ctp.company, ctp.track_name + + + + + + + + + + \ No newline at end of file diff --git a/Week3/solutions/hw2_dorzhiev_ardan/hw2_task8.sql b/Week3/solutions/hw2_dorzhiev_ardan/hw2_task8.sql new file mode 100644 index 0000000..49af2f3 --- /dev/null +++ b/Week3/solutions/hw2_dorzhiev_ardan/hw2_task8.sql @@ -0,0 +1,50 @@ +/* Вывести треки по каждому жанру, которые входять в самые популярные 25% с точки зрения количества покупок. + * Если у нескольких треков одинаково количество приобретенных композиций, популярность определяется в лексикографическом порядке + * (Например, трек, начинающийся с 'A' будет более популярен, чем трек, начинающийся с 'B'). + * Для каждого трека указать популярность в процентах от общего количества покупок по жанру. + * (track_name, popularity) + * + * В рамках каждого жанра надо выбрать популярные + */ + +29.03.2021 - Пока еще разбираюсь + + +больше ссреднего - 50% записей +моду исп-ть? +sorted aggrefatef functions - +rank не через оконные ф-ции + + +select * +from information_schema.tables +where table_schema = 'public' + +-- определить топ 25% с точки зрения кол-ва покупок +with genre_tracks as ( + select t.genre_id + , t.track_id + , t."name" as track_name + , count(il.invoice_id) as cnt_sales + from track t + join invoice_line il ON il.track_id = t.track_id + group by t.genre_id + , t.track_id + , t."name" + order by t.genre_id, count(il.invoice_id) desc, t."name" + ) + + + select g.genre_id + , g.track_id + , g.track_name + , g.cnt_sales + , N -- номер в рамках группы + , (select trunc(count (1) * 0.25) from genre_tracks g1 where g1.genre_id = g.genre_id) N -- граница топ 25% в группе + from genre_tracks g + + + --- пронумеровать в рамках группы + --- 25% считать от максимальго номера в группе + + select trunc() \ No newline at end of file diff --git a/Week3/solutions/hw2_dorzhiev_ardan/hw2_task9.sql b/Week3/solutions/hw2_dorzhiev_ardan/hw2_task9.sql new file mode 100644 index 0000000..579c9a7 --- /dev/null +++ b/Week3/solutions/hw2_dorzhiev_ardan/hw2_task9.sql @@ -0,0 +1,42 @@ +/* Для каждого альбома жанр определяется как наибольшая суммарная продолжительность треков по жанру. + * + * Вывести альбом, жанр, и общее количество купленных песен по нему. (album_name, genre_name, cnt) + * + * */ + +with album_agg as (select a.album_id + , g.genre_id + , sum(t.milliseconds) ms_tracks + from album a + join track t on t.album_id = a.album_id + join genre g on t.genre_id = g.genre_id + -- where a.album_id in (73, 109) -- FOR TEST + group by a.album_id + , g.genre_id + order by a.album_id + ) , + album_genre as (select a1.album_id + , a1.genre_id + from album_agg a1 + where (a1.album_id, a1.genre_id) = (SELECT a2.album_id, a2.genre_id + FROM album_agg a2 + where a1.album_id = a2.album_id + and a1.genre_id = a2.genre_id + order by a2.ms_tracks desc + limit 1 + ) + + + + ) + + select a2.title as album_name + , g."name" as genre_name + , count(il.track_id) as cnt + from album_genre a + join album a2 on a.album_id = a2.album_id + join genre g on a.genre_id = g.genre_id + join track t on a.album_id = t.album_id + join invoice_line il on t.track_id = il.track_id + group by a2.title + , g."name"