+ @if ($.song.is_tie)
+
{{.song.scrobbles}} scrobbles ({{.song.rank}} place, tied)
+ @else
{{.song.scrobbles}} scrobbles ({{.song.rank}} place)
+ @end
@partial partials/firstlast_listens(firstlast: .firstlast)
Yearly Performance
@partial partials/timescale(range: .yearly)
diff --git a/src/queries.zig b/src/queries.zig
index a665a58..27d1f65 100644
--- a/src/queries.zig
+++ b/src/queries.zig
@@ -346,14 +346,17 @@ pub fn loadQuery(entity: EntityType, query_type: QueryTypeEnum) GeneratedQuery {
.entity_info => switch (entity) {
.scrobble => unreachable,
.song =>
- \\SELECT * FROM
- \\(SELECT *, TO_CHAR(ROW_NUMBER() OVER (ORDER BY scrobbles DESC),'FM99999th') AS rank FROM
- \\(SELECT songs.name AS song_name, songs.id AS song_id, COUNT(scrobbles) AS scrobbles
- \\FROM albumsongs
- \\INNER JOIN songs ON albumsongs.song_id = songs.id
- \\INNER JOIN scrobbles ON scrobbles.albumsong = albumsongs.id
- \\GROUP BY songs.id))
- \\WHERE song_id = $1
+ \\WITH ranked AS (
+ \\SELECT songs.name AS song_name, COUNT(songs.id) AS scrobbles, RANK() OVER ( ORDER BY COUNT(songs.id) DESC) AS rank, songs.id AS song_id
+ \\FROM scrobbles
+ \\INNER JOIN albumsongs ON albumsongs.id = scrobbles.albumsong
+ \\INNER JOIN songs ON songs.id = albumsongs.song_id
+ \\GROUP BY songs.id)
+ \\SELECT * FROM (SELECT song_name, scrobbles, TO_CHAR(rank,'FM9999th') AS rank, song_id,
+ \\( rank = lag(rank, 1, -1::bigint) OVER (ORDER BY rank)
+ \\OR rank = lead(rank, 1, -1::bigint) OVER (ORDER BY rank)
+ \\)AS is_tie
+ \\FROM ranked) WHERE song_id = $1;
,
.album =>
\\SELECT album_name, t.album_id, artists.name AS artist_name, artists.id AS artist_id, song_num, scrobbles, rank FROM