From 43dfca2e12cd1e4eb3dcc83dc0685bfd7117b340 Mon Sep 17 00:00:00 2001 From: dashavpav Date: Fri, 2 Apr 2021 19:17:19 +0300 Subject: [PATCH] First commit --- Week3/Solutions/hw2_task1.sql | 13 ++++++++ Week3/Solutions/hw2_task10.sql | 43 ++++++++++++++++++++++++++ Week3/Solutions/hw2_task2.sql | 7 +++++ Week3/Solutions/hw2_task3.sql | 10 ++++++ Week3/Solutions/hw2_task4.sql | 7 +++++ Week3/Solutions/hw2_task5.sql | 9 ++++++ Week3/Solutions/hw2_task6.sql | 30 ++++++++++++++++++ Week3/Solutions/hw2_task7.sql | 44 ++++++++++++++++++++++++++ Week3/Solutions/hw2_task8.sql | 56 ++++++++++++++++++++++++++++++++++ Week3/Solutions/hw2_task9.sql | 21 +++++++++++++ 10 files changed, 240 insertions(+) create mode 100644 Week3/Solutions/hw2_task1.sql create mode 100644 Week3/Solutions/hw2_task10.sql create mode 100644 Week3/Solutions/hw2_task2.sql create mode 100644 Week3/Solutions/hw2_task3.sql create mode 100644 Week3/Solutions/hw2_task4.sql create mode 100644 Week3/Solutions/hw2_task5.sql create mode 100644 Week3/Solutions/hw2_task6.sql create mode 100644 Week3/Solutions/hw2_task7.sql create mode 100644 Week3/Solutions/hw2_task8.sql create mode 100644 Week3/Solutions/hw2_task9.sql diff --git a/Week3/Solutions/hw2_task1.sql b/Week3/Solutions/hw2_task1.sql new file mode 100644 index 0000000..a98a6ab --- /dev/null +++ b/Week3/Solutions/hw2_task1.sql @@ -0,0 +1,13 @@ +select a.title as album_name +from album as a + join track as t + on a.album_id=t.album_id + where t.milliseconds > 250000 + group by a.title; + + +select a.title as album_name, count(t) as cnt +from album as a + join track as t + on a.album_id = t.album_id + group by a.title; diff --git a/Week3/Solutions/hw2_task10.sql b/Week3/Solutions/hw2_task10.sql new file mode 100644 index 0000000..41ee6af --- /dev/null +++ b/Week3/Solutions/hw2_task10.sql @@ -0,0 +1,43 @@ +with sum_track as ( + select album.title as album_name,album.artist_id, count(t.track_id) as count_t, m_t.name + from album + join track t on album.album_id = t.album_id + join media_type as m_t on t.media_type_id = m_t.media_type_id + --join invoice_line il on t.track_id = il.track_id + group by album.title, album.artist_id, m_t.name + order by album.title + ), + q1 as ( + select sum_track.album_name, max(sum_track.count_t) as cnt + from sum_track + group by sum_track.album_name +), + q2 as( + select sum_track.artist_id,sum_track.name, count(sum_track.album_name) as c_1 + from sum_track + join q1 on sum_track.album_name=q1.album_name + where sum_track.count_t=q1.cnt + group by sum_track.artist_id, sum_track.name + order by sum_track.artist_id, sum_track.name ), + q3 as( + select q2.artist_id, max(q2.c_1) as m_c + from q2 + group by q2.artist_id + ), + q4 as( + select q2.artist_id, count(q2.name) as all_album + from q2 + group by q2.artist_id + order by q2.artist_id + ) + , + q5 as ( + select a.name as artist_name, q2.name as media_type_name, q3.m_c as media_cnt, q4.all_album aswhole_cnt + from artist as a + join q4 on a.artist_id=q4.artist_id + join q3 on a.artist_id=q3.artist_id + join q2 on q3.artist_id=q2.artist_id + where q2.c_1=q3.m_c + ) +select * +from q5; \ No newline at end of file diff --git a/Week3/Solutions/hw2_task2.sql b/Week3/Solutions/hw2_task2.sql new file mode 100644 index 0000000..31d946a --- /dev/null +++ b/Week3/Solutions/hw2_task2.sql @@ -0,0 +1,7 @@ +select g.name as general_name, mt.name as media_type, count(t) as cnt +from track as t + join genre as g + on g.genre_id = t.genre_id + join media_type mt + on t.media_type_id = mt.media_type_id + group by g.name, mt.name \ No newline at end of file diff --git a/Week3/Solutions/hw2_task3.sql b/Week3/Solutions/hw2_task3.sql new file mode 100644 index 0000000..fbb540f --- /dev/null +++ b/Week3/Solutions/hw2_task3.sql @@ -0,0 +1,10 @@ +select concat(emp.first_name,' ', emp.last_name) as employee_full_name, emp.birth_date as employee_birth_date, + emp.hire_date as employee_hire_date, concat(manager.first_name, ' ', manager.last_name) as manager_full_name, + manager.birth_date as manager_birth_date, manager.hire_date as manager_hire_date +from employee as emp + left + join employee as manager + on emp.reports_to = manager.employee_id + where emp.birth_date < manager.birth_date + and emp.hire_date > manager.hire_date; + diff --git a/Week3/Solutions/hw2_task4.sql b/Week3/Solutions/hw2_task4.sql new file mode 100644 index 0000000..c345565 --- /dev/null +++ b/Week3/Solutions/hw2_task4.sql @@ -0,0 +1,7 @@ +select art.name as artist_name, count(tr) as qty +from track as tr +join genre g on tr.genre_id = g.genre_id +join album a on tr.album_id = a.album_id +join artist art on a.artist_id = art.artist_id +where g.name in ('Rock', 'Metal') +group by art.artist_id diff --git a/Week3/Solutions/hw2_task5.sql b/Week3/Solutions/hw2_task5.sql new file mode 100644 index 0000000..a6fe632 --- /dev/null +++ b/Week3/Solutions/hw2_task5.sql @@ -0,0 +1,9 @@ +select concat(emp.first_name,' ', emp.last_name) as employee_full_name, count(distinct i) as invoices_count, + count(distinct c) customers_count, count(distinct i.billing_address) as addresses_count, + count(i_l.track_id) as tracks_count +from employee as emp +join customer c on emp.employee_id = c.support_rep_id +join invoice as i on c.customer_id = i.customer_id +join invoice_line i_l on i.invoice_id = i_l.invoice_id +group by emp.employee_id; + diff --git a/Week3/Solutions/hw2_task6.sql b/Week3/Solutions/hw2_task6.sql new file mode 100644 index 0000000..44ed175 --- /dev/null +++ b/Week3/Solutions/hw2_task6.sql @@ -0,0 +1,30 @@ +-- select c.last_name +-- from customer as c +-- order by length(c.last_name)-length(replace(lower(c.last_name),'a', '')); +-- -- select * +-- -- from customer; +-- +-- +-- select length(c.last_name)-length(replace(lower(c.last_name),'a', '')) as s +-- from customer as c +-- group by s +-- order by s; + +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' + else 'D' + END segment_group, count(distinct mt) + from customer as c + join invoice i on c.customer_id = i.customer_id + join invoice_line i_C on i.invoice_id = i_c.invoice_id + join track t on i_C.track_id = t.track_id + join media_type mt on t.media_type_id = mt.media_type_id + join genre g on g.genre_id = t.genre_id + where g.name in ('Metal', 'Heavy Metal') + group by segment_group + order by segment_group; \ No newline at end of file diff --git a/Week3/Solutions/hw2_task7.sql b/Week3/Solutions/hw2_task7.sql new file mode 100644 index 0000000..1c8c880 --- /dev/null +++ b/Week3/Solutions/hw2_task7.sql @@ -0,0 +1,44 @@ + --Жанр - компания - песня - кол-во покупок + with gen_comp_track as( + select g.name, c.company, t.name as t_name, il.quantity + from genre as g + join track t on g.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 g.name, c.company, t.name, il.quantity + order by g.name, c.company, il.quantity + ) + --Жанр и количество покупок одной компанией + , + q2 as( + select gen_comp_track.name, gen_comp_track.company, count(company) as count + from gen_comp_track + group by gen_comp_track.name, gen_comp_track.company + order by gen_comp_track.name + + ) + -- жанр - максмальная покупка + , + q3 as( + select q2.name, max(count) as max_count + from q2 + group by q2.name + order by q2.name + + ) + -- жанр - компания, которая больше купила этот жанр(соеденияем q2 и q3) +, + q4 as( + select distinct on(q3.name) q3.name, q2.company, gen_comp_track.t_name,q3.max_count + from q2 + join gen_comp_track on q2.name=gen_comp_track.name + join q3 on q3.name = q2.name + where q2.count = q3.max_count + + ) + +select q4.company as company_name, q4.t_name as track_name +from q4; + diff --git a/Week3/Solutions/hw2_task8.sql b/Week3/Solutions/hw2_task8.sql new file mode 100644 index 0000000..d34432a --- /dev/null +++ b/Week3/Solutions/hw2_task8.sql @@ -0,0 +1,56 @@ + +-- в выборе убираются песни, которые не были куплены ни разу +--жанры - трек - кол-во покупок +with popular as ( + select g.name as g_name, t.name as t_name, sum(il.quantity) as quan + from genre as g + 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, il.quantity, t.name + order by g.name,il.quantity, t.name +), +-- жанр - кол-во песен, которые покупали более одного раза + q1 as ( + select popular.g_name as name, count(popular.quan) as cnt + from popular + group by popular.g_name +-- жанр-трек-процент покупки песни от q1 + ), + q2 as( + select popular.g_name, popular.t_name, + round((popular.quan::numeric/q1.cnt::numeric)*100, 2) as round_q2 + from popular + join q1 on q1.name=popular.g_name + order by popular.g_name, round_q2 desc , popular.t_name + + ), + -- q2 и индексация + q3 as( + select *, rank() over(partition by q2.g_name order by q2.round_q2 desc, q2.t_name) as indc + from q2 + order by q2.g_name, q2.round_q2 desc , q2.t_name + ), + -- жанр-трек-процент с учетом предыдущего + q4 as ( + select q3_s.g_name, q3_s.t_name, sum(q3_f.round_q2) as percent + from q3 as q3_f + join q3 as q3_s on q3_f.g_name=q3_s.g_name + and q3_f.indc <= q3_s.indc + group by q3_s.g_name, q3_s.t_name, q3_s.indc + order by q3_s.g_name, q3_s.indc + ), + -- q4 только треки, входящие в 25% популярных + q5 as( + select q4.g_name,q4.t_name + from q4 + where q4.percent <= 25 + ) +-- конечный вывод +select q5.t_name as track_name, q2.round_q2 as popularity + from q5 + join q2 on q5.g_name=q2.g_name and q5.t_name=q2.t_name + + + + + diff --git a/Week3/Solutions/hw2_task9.sql b/Week3/Solutions/hw2_task9.sql new file mode 100644 index 0000000..a4bd4af --- /dev/null +++ b/Week3/Solutions/hw2_task9.sql @@ -0,0 +1,21 @@ + +-- Подсчет суммы миллисекунд одинакого жанра +with sum_track as ( + select album.title as album_name, sum(t.milliseconds) as track_mil,sum(il.quantity) as track_buy, g.name as genre_name + from album + join track t on album.album_id = t.album_id + join genre g on t.genre_id = g.genre_id + join invoice_line il on t.track_id = il.track_id + group by album.title, g.name + order by album.title + ), + q1 as ( + select sum_track.album_name, max(sum_track.track_mil) as cnt + from sum_track + group by sum_track.album_name +) +select q1.album_name, sum_track.genre_name, q1.cnt +from q1 +join sum_track on sum_track.album_name=q1.album_name +where q1.cnt = sum_track.track_mil +group by q1.album_name, sum_track.genre_name, q1.cnt;