From 316eb77d695f86127cdac497edcd4d14c0fc1e1e Mon Sep 17 00:00:00 2001 From: ardan Date: Mon, 29 Mar 2021 10:09:01 +0300 Subject: [PATCH] add hw1 and hw2 --- .DS_Store | Bin 0 -> 8196 bytes Week1/.DS_Store | Bin 10244 -> 10244 bytes Week1/solutions/.DS_Store | Bin 0 -> 6148 bytes .../solutions/hw1_dorzhiev_ardan/coffeshop.sh | 67 +++++++++++++++ .../hw1_dorzhiev_ardan/davecoffeeshop.db | 4 + ...75\320\260\320\273\320\260 DaveCoffeeShop" | 59 ++++++++++++++ Week3/.DS_Store | Bin 0 -> 6148 bytes Week3/solutions/.DS_Store | Bin 0 -> 6148 bytes .../hw2_dorzhiev_ardan/hw2_task1.sql | 24 ++++++ .../hw2_dorzhiev_ardan/hw2_task10.sql | 76 ++++++++++++++++++ .../hw2_dorzhiev_ardan/hw2_task2.sql | 17 ++++ .../hw2_dorzhiev_ardan/hw2_task3.sql | 16 ++++ .../hw2_dorzhiev_ardan/hw2_task4.sql | 28 +++++++ .../hw2_dorzhiev_ardan/hw2_task5.sql | 42 ++++++++++ .../hw2_dorzhiev_ardan/hw2_task6.sql | 51 ++++++++++++ .../hw2_dorzhiev_ardan/hw2_task7.sql | 65 +++++++++++++++ .../hw2_dorzhiev_ardan/hw2_task8.sql | 50 ++++++++++++ .../hw2_dorzhiev_ardan/hw2_task9.sql | 42 ++++++++++ 18 files changed, 541 insertions(+) create mode 100644 .DS_Store create mode 100644 Week1/solutions/.DS_Store create mode 100644 Week1/solutions/hw1_dorzhiev_ardan/coffeshop.sh create mode 100644 Week1/solutions/hw1_dorzhiev_ardan/davecoffeeshop.db create mode 100644 "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" create mode 100644 Week3/.DS_Store create mode 100644 Week3/solutions/.DS_Store create mode 100644 Week3/solutions/hw2_dorzhiev_ardan/hw2_task1.sql create mode 100644 Week3/solutions/hw2_dorzhiev_ardan/hw2_task10.sql create mode 100644 Week3/solutions/hw2_dorzhiev_ardan/hw2_task2.sql create mode 100644 Week3/solutions/hw2_dorzhiev_ardan/hw2_task3.sql create mode 100644 Week3/solutions/hw2_dorzhiev_ardan/hw2_task4.sql create mode 100644 Week3/solutions/hw2_dorzhiev_ardan/hw2_task5.sql create mode 100644 Week3/solutions/hw2_dorzhiev_ardan/hw2_task6.sql create mode 100644 Week3/solutions/hw2_dorzhiev_ardan/hw2_task7.sql create mode 100644 Week3/solutions/hw2_dorzhiev_ardan/hw2_task8.sql create mode 100644 Week3/solutions/hw2_dorzhiev_ardan/hw2_task9.sql diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c13239c8df509f15b231aa9a1d1cb23ec0e68359 GIT binary patch literal 8196 zcmeI1zi-n(6vv<26l@_xgesBI2t_I=pu{OH3z7+8U_%(ufuhDCQEKYgA#oaL2#P2h z3qoQDe+LX~{FvC-y7DKm04wi)B)KC_M^u?R>F#^E_nv+CIs2~X0)STP)(QX_0MIcL zO`pIbCJ{TyGiiahn5Y`YgWo7P55i_^##1#Y0*Zhlpa>`eioj7JfO|Gc`kZ~ASyibB zC<6Z_0kS@rn2Fk4hfL|xfdxGRpr){yCakAP1=Zwga~(283nq<)qOwqpA2Bo*j_oG* zv$+nLvT)G&;X~th*7ylUqj$&ao75dNo2e=l0YzYzfQd~hxC9OGAd=4Sua+E9mG%r5xYhlkLq_Bt(om#@{9?{%Vl z{yL-~GyT4Gc`awITZ5e0FXY$rq<&>EF!VFo z!quCV=99ht)4{V584IpBd}V@D?DwR6i?x`cO0duF|BUw%v40pn9%GNWUNf9dz~P?K zRAg<^(U|M)I_K=!e;0&!aWdjP zq)B)|KbZ;fbKzUbhi^&n_4jKMd`pD?>-VGa8!?549@94=-a~?~f5#gL&$l%felhv* zixT|vw?9c}iX!~r&C7E$Pd<7~;m3PO@GlVd0{r4!_^VRSRz7}~;#S3;ZNBTyJ{IUP z?OD8s)U%Zzv}*}27TMS`(oT=#sFQyfV%_96o9mD%S}^_l4*@%1NejK&|Hb`R+GW-LPoL2w7JmS+ C@KAOD literal 0 HcmV?d00001 diff --git a/Week1/.DS_Store b/Week1/.DS_Store index 941134109f94fe7aa90b17bcbd1459bd4da06b9c..f8b00393fd813754ba7205577afab374534f1052 100644 GIT binary patch delta 917 zcmZn(XbG6$&nUJrU^hRb*km4oAN=Wt!O8i#1q>k2*m-*MX90QE`rLdMm!zEhB%m0F z!=6H+>l}w2fowL0Oom*BM22*RREFZ*{1k#}3NnyPZ%P0ffoeusa8X`PeqK6IoDqmQ z8HyS58FCo(N*PLkR^>C~F%&127Z*UCaw4f9C$qT3z~DL~6Eh1d8#@OlCkH1l=VW_< zWIYfwUO>FM+QiIEN5RspR!5=Q(%eKx!Q8;8ww9AaT-DIlGal L$Vd^T1Ck;D)OzC` delta 67 zcmZn(XbG6$&&aVcU^hP_$7CLXADdMK`B*2<662p7D)Dl2groxN=5unEj2j!4Fl}a6 S_{FkWQB;r-COCuyP3P3l|C%1*xx{{2=)2WTJ-Gk`l=q&ie|?F={r&cHVVay|q!!DyHj%h3T_n zT0&xiVKmH&=z*|?0yUJa#9$4FKiIfvm=!gg*oqIfmA{G?E~{hyP=*snMc2-NGcaUe zUq7dE|DWQQ87=aMA^znII0OHT0iHDTW`<4K-MX 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 0000000000000000000000000000000000000000..66cda8f69ef16d41c3ae876258bdbe717203c493 GIT binary patch literal 6148 zcmeHKL2uJA6n@@1nt*_6n#2xB^>0M;1>Er1397+45v zSFx%P8mF=#ORDDvA`^3X@j=Vo=l#Kgt?tkaXa@d22I$*ef%_1E2RW3#-;GaS%A(*I|;4c<~-rNnbafaD#Zgf#bZJS9AbD z_V~!ny?mH;ymW_J&%M0oEByuM@h{!;Uq<0*x3Tt^C%G3TVJe)XAVibbuc9R2qYfV? zK_=#L<$zddx3NARZ`$pq^`JdzTH}`8wwqRa^WkJ-8n^DX9zEIXA0Cb0P2PW?z2MD^ zSF@0t3TN;Um5QyF>EF3iZ8d)cPfvc_{azP8g^Ky+kKxaj<)b*II4kCR>!wM}lLH)` z?Tjq7T$lkxpK>+_jVj5%f5h-g4LkN_r`5(|GVEY|(?2xZ4e8VY3sGjZ2M@{Th1F z@1hq!LBEdg%{)a(3&BDuVII8sy`6c#`SS}ilK}wHp2Q7+8UQ%xgq3wHeq+>5K4&Xj zQ$-ZIj~En;;0*eZ%w^jOtAJJDe^Y?=?gsAH0-Df;=liz@r&tr>evYxsqGCLZQWatT zeKbsyaqfA)#L8;rO?Az2UB`Xr9tC|>1bLWG#_e!)NMCzl-j6u`rd0YAhtYo0E4sDK zuPV#KB9py!>hfc2R+rO;*YfJJ)%-M@ zxz5&y#^>GR!Oyel`RwA-s4eht()OP55w0*;Xz}SuBlw{PLqpu5({Lf)Ky^ASnse>n zT@9+YUl!-aujUT>&*ytX(_U!4r@<&oRd#~;kD3wJ+EOaOKe6+6DOYC~Wfiar{EY&1 zK1g&zpRqKkj}9#K69BP-)!Hzow*+w{qt93x#1=GRsECFt_=zD59qT3M`HZDOLkGc+ z55Xe~exV3GI`%JhItbsOEv*7pftL!bn$H^D|2uzv|Gy;JFROr6V5t-kl}^xU 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"