Changes between Initial Version and Version 1 of AdvancedReports


Ignore:
Timestamp:
01/22/26 19:47:56 (8 days ago)
Author:
231136
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedReports

    v1 v1  
     1= Finkwave
     2
     3== Напредни извештаи од базата (SQL и складирани процедури)
     4
     5
     6=== 1. Детален извештај за број на лајкови, слушања и просечна оценка за секој албум
     7{{{
     8SET search_path TO project;
     9
     10WITH 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),
     18listenCount 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 ),
     28averageGrade 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)
     36SELECT
     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
     41FROM musical_entities me
     42LEFT JOIN likeCount lk ON lk.album_id = me.id
     43LEFT JOIN listenCount lc ON lc.album_id = lk.album_id
     44LEFT JOIN averageGrade ag ON ag.album_id = lk.album_id
     45ORDER BY total_likes DESC, total_listens DESC
     46}}}
     47
     48
     49=== 2. Детален извештај за број на лајкови, број на слушања, просечна оценка за една песна, како и бројот на плејлисти кој ја содржат таа
     50{{{
     51SET search_path TO project;
     52
     53WITH 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),
     61listenCount 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),
     68averageGrade 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),
     76playlist_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)
     84SELECT
     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
     90FROM musical_entities me
     91JOIN songs s ON me.id = s.id
     92LEFT JOIN likeCount lc ON lc.song_id = s.id
     93LEFT JOIN listenCount ls ON s.id= ls.song_id
     94LEFT JOIN playlist_count pc ON pc.song_id = ls.song_id
     95LEFT JOIN averageGrade ag ON ag.song_id = lc.song_id
     96ORDER BY total_likes DESC, total_listens DESC;
     97}}}
     98
     99
     100=== 3. Детален извештај за најпопуларен артист за секој настан според бројот на следбеници, а потоа вкупно слушања за секоја песна на артистот
     101{{{
     102SET search_path TO 'project';
     103
     104WITH 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),
     113listensCount 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)
     123SELECT
     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}}}