| | 1 | = Finkwave |
| | 2 | |
| | 3 | == Напредни извештаи од базата (SQL и складирани процедури) |
| | 4 | |
| | 5 | |
| | 6 | === 1. Детален извештај за број на лајкови, слушања и просечна оценка за секој албум |
| | 7 | {{{ |
| | 8 | SET search_path TO project; |
| | 9 | |
| | 10 | WITH likeCount AS ( |
| | 11 | SELECT |
| | 12 | a.id AS album_id, |
| | 13 | COUNT(l.listener_id) AS total_likes |
| | 14 | FROM albums a |
| | 15 | LEFT JOIN likes l ON l.musical_entity_id=a.id |
| | 16 | GROUP BY a.id |
| | 17 | ), |
| | 18 | listenCount AS ( |
| | 19 | SELECT |
| | 20 | s.album_id, |
| | 21 | COUNT(timestamp) AS total_listens |
| | 22 | FROM listens l |
| | 23 | JOIN songs s ON l.song_id = s.id |
| | 24 | JOIN albums a ON a.id = s.album_id |
| | 25 | WHERE album_id IS NOT NULL |
| | 26 | GROUP BY s.album_id |
| | 27 | ), |
| | 28 | averageGrade AS ( |
| | 29 | SELECT |
| | 30 | a.id AS album_id, |
| | 31 | ROUND(AVG(grade),2) AS average_grade |
| | 32 | FROM reviews r |
| | 33 | JOIN albums a ON a.id = r.musical_entity_id |
| | 34 | GROUP BY a.id |
| | 35 | ) |
| | 36 | SELECT |
| | 37 | me.title, |
| | 38 | COALESCE(total_likes, 0) AS total_likes, |
| | 39 | COALESCE(total_listens, 0) AS total_listens, |
| | 40 | COALESCE(CAST(ag.average_grade AS varchar), 'no reviews') AS average_grade |
| | 41 | FROM musical_entities me |
| | 42 | LEFT JOIN likeCount lk ON lk.album_id = me.id |
| | 43 | LEFT JOIN listenCount lc ON lc.album_id = lk.album_id |
| | 44 | LEFT JOIN averageGrade ag ON ag.album_id = lk.album_id |
| | 45 | ORDER BY total_likes DESC, total_listens DESC |
| | 46 | }}} |
| | 47 | |
| | 48 | |
| | 49 | === 2. Детален извештај за број на лајкови, број на слушања, просечна оценка за една песна, како и бројот на плејлисти кој ја содржат таа |
| | 50 | {{{ |
| | 51 | SET search_path TO project; |
| | 52 | |
| | 53 | WITH likeCount AS ( |
| | 54 | SELECT |
| | 55 | s.id AS song_id, |
| | 56 | COUNT(l.listener_id) AS total_likes |
| | 57 | FROM songs s |
| | 58 | JOIN likes l ON l.musical_entity_id=s.id |
| | 59 | GROUP BY s.id |
| | 60 | ), |
| | 61 | listenCount AS ( |
| | 62 | SELECT |
| | 63 | l.song_id AS song_id, |
| | 64 | COUNT(timestamp) AS total_listens |
| | 65 | FROM listens l |
| | 66 | GROUP BY l.song_id |
| | 67 | ), |
| | 68 | averageGrade AS ( |
| | 69 | SELECT |
| | 70 | r.musical_entity_id AS song_id, |
| | 71 | ROUND(AVG(r.grade),2) AS average_grade |
| | 72 | FROM reviews r |
| | 73 | JOIN songs s ON s.id = r.musical_entity_id |
| | 74 | GROUP BY musical_entity_id |
| | 75 | ), |
| | 76 | playlist_count AS ( |
| | 77 | SELECT |
| | 78 | ps.song_id, |
| | 79 | COUNT(ps.song_id) AS count_playlists |
| | 80 | FROM songs s |
| | 81 | JOIN playlist_songs ps ON s.id = ps.song_id |
| | 82 | GROUP BY ps.song_id |
| | 83 | ) |
| | 84 | SELECT |
| | 85 | me.title, |
| | 86 | COALESCE(total_listens, 0) AS total_listens, |
| | 87 | COALESCE(total_likes, 0) AS total_likes, |
| | 88 | COALESCE(CAST(average_grade AS varchar), 'no reviews') AS average_grade, |
| | 89 | COALESCE(count_playlists, 0) AS num_playlists |
| | 90 | FROM musical_entities me |
| | 91 | JOIN songs s ON me.id = s.id |
| | 92 | LEFT JOIN likeCount lc ON lc.song_id = s.id |
| | 93 | LEFT JOIN listenCount ls ON s.id= ls.song_id |
| | 94 | LEFT JOIN playlist_count pc ON pc.song_id = ls.song_id |
| | 95 | LEFT JOIN averageGrade ag ON ag.song_id = lc.song_id |
| | 96 | ORDER BY total_likes DESC, total_listens DESC; |
| | 97 | }}} |
| | 98 | |
| | 99 | |
| | 100 | === 3. Детален извештај за најпопуларен артист за секој настан според бројот на следбеници, а потоа вкупно слушања за секоја песна на артистот |
| | 101 | {{{ |
| | 102 | SET search_path TO 'project'; |
| | 103 | |
| | 104 | WITH followersCount AS ( |
| | 105 | SELECT a.user_id AS artist, |
| | 106 | pa.event_id, |
| | 107 | COALESCE(COUNT(f.follower),0) AS followers |
| | 108 | FROM artists a |
| | 109 | JOIN performs_at pa ON pa.artist_id=a.user_id |
| | 110 | LEFT JOIN follows f ON f.followee=a.user_id |
| | 111 | GROUP BY a.user_id,pa.event_id |
| | 112 | ), |
| | 113 | listensCount AS ( |
| | 114 | SELECT |
| | 115 | a.user_id AS artist, |
| | 116 | COALESCE(COUNT(l.timestamp),0) AS listen_count |
| | 117 | FROM artists a |
| | 118 | JOIN performs_at pa ON pa.artist_id=a.user_id |
| | 119 | JOIN musical_entities me ON me.released_by=pa.artist_id |
| | 120 | LEFT JOIN listens l ON l.song_id=me.id |
| | 121 | GROUP BY a.user_id |
| | 122 | ) |
| | 123 | SELECT |
| | 124 | e.location, |
| | 125 | e.venue, |
| | 126 | u.full_name, |
| | 127 | fc.followers, |
| | 128 | lc.listen_count |
| | 129 | FROM events e |
| | 130 | JOIN performs_at pa ON pa.event_id=e.event_id |
| | 131 | JOIN followersCount fc ON fc.artist=pa.artist_id |
| | 132 | JOIN listensCount lc ON lc.artist=fc.artist |
| | 133 | JOIN users u ON u.user_id=lc.artist |
| | 134 | WHERE not exists( |
| | 135 | SELECT 1 |
| | 136 | FROM artists a |
| | 137 | JOIN followersCount fc1 ON a.user_id=fc1.artist |
| | 138 | JOIN listensCount lc1 ON lc1.artist=fc1.artist |
| | 139 | WHERE fc.event_id=fc1.event_id |
| | 140 | AND (fc.followers<fc1.followers |
| | 141 | OR (fc.followers=fc1.followers AND lc.listen_count<lc1.listen_count) |
| | 142 | OR (fc.followers=fc1.followers AND lc.listen_count=lc1.listen_count AND lc.artist<lc1.artist) |
| | 143 | ) |
| | 144 | ); |
| | 145 | }}} |