| | 146 | |
| | 147 | |
| | 148 | == 4. Детален извештај за најпопуларниот артист според месечни слушања за изминатата година |
| | 149 | {{{ |
| | 150 | SET search_path TO 'project'; |
| | 151 | |
| | 152 | with one_year AS ( |
| | 153 | SELECT |
| | 154 | DATE_TRUNC('year', CURRENT_DATE) - INTERVAL '1 year' AS year_start, |
| | 155 | (DATE_TRUNC('year', CURRENT_DATE) - INTERVAL '1 year') + INTERVAL '1 year - 1 day' AS year_end |
| | 156 | ), |
| | 157 | monthly_artist_listens AS ( |
| | 158 | SELECT |
| | 159 | EXTRACT(MONTH FROM l.timestamp) AS month, |
| | 160 | a.user_id,COUNT(l.timestamp)AS count |
| | 161 | FROM listens l |
| | 162 | JOIN one_year oy ON l.timestamp>=oy.year_start AND l.timestamp<=oy.year_end |
| | 163 | JOIN musical_entities me ON l.song_id=me.id |
| | 164 | JOIN artists a ON a.user_id=me.released_by |
| | 165 | GROUP BY EXTRACT(MONTH FROM l.timestamp),a.user_id |
| | 166 | ), |
| | 167 | max_per_month AS( |
| | 168 | SELECT |
| | 169 | mal.month AS month, |
| | 170 | MAX(count) AS max_month_counter |
| | 171 | FROM monthly_artist_listens mal |
| | 172 | GROUP BY mal.month |
| | 173 | ORDER BY mal.month |
| | 174 | ), |
| | 175 | most_popular AS ( |
| | 176 | SELECT |
| | 177 | mal.month, |
| | 178 | user_id, |
| | 179 | max_month_counter |
| | 180 | FROM monthly_artist_listens mal |
| | 181 | JOIN max_per_month mpm ON mpm.month=mal.month AND mpm.max_month_counter=mal.count |
| | 182 | WHERE NOT EXISTS ( |
| | 183 | SELECT 1 |
| | 184 | FROM monthly_artist_listens mal1 |
| | 185 | JOIN max_per_month mpm1 ON mpm1.month=mal1.month AND mpm1.max_month_counter=mal1.count |
| | 186 | WHERE mal.user_id > mal1.user_id AND mal1.month=mal.month |
| | 187 | ) |
| | 188 | ORDER BY mal.month |
| | 189 | ), |
| | 190 | months AS ( |
| | 191 | SELECT |
| | 192 | n AS month_num, |
| | 193 | TO_CHAR(MAKE_DATE(2025, n, 1), 'Month') AS month_name |
| | 194 | FROM GENERATE_SERIES(1, 12) AS g(n) |
| | 195 | ) |
| | 196 | SELECT |
| | 197 | CONCAT(EXTRACT(YEAR FROM oy.year_start),'-',m.month_name) AS month, |
| | 198 | COALESCE(u.full_name,'n/a') AS artist_name, |
| | 199 | COALESCE(mp.max_month_counter,0) AS aonthly_listens |
| | 200 | FROM months m |
| | 201 | LEFT JOIN most_popular mp ON mp.month=m.month_num |
| | 202 | LEFT JOIN users u ON mp.user_id=u.user_id |
| | 203 | CROSS JOIN one_year oy |
| | 204 | ORDER BY m.month_num |
| | 205 | }}} |