fix: inefficient SQL query for getting songs close to milestone

This commit is contained in:
alikia2x (寒寒) 2025-03-22 00:28:47 +08:00
parent 8158ce10c0
commit fabb77d98d
Signed by: alikia2x
GPG Key ID: 56209E0CCD8420C6

View File

@ -5,40 +5,31 @@ import { parseTimestampFromPsql } from "lib/utils/formatTimestampToPostgre.ts";
export async function getSongsNearMilestone(client: Client) { export async function getSongsNearMilestone(client: Client) {
const queryResult = await client.queryObject<VideoSnapshotType>(` const queryResult = await client.queryObject<VideoSnapshotType>(`
WITH max_views_per_aid AS ( WITH filtered_snapshots AS (
-- aid views aid songs SELECT
SELECT vs.*
vs.aid, FROM
MAX(vs.views) AS max_views
FROM
video_snapshot vs video_snapshot vs
INNER JOIN WHERE
songs s (vs.views >= 90000 AND vs.views < 100000) OR
ON (vs.views >= 900000 AND vs.views < 1000000)
vs.aid = s.aid
GROUP BY
vs.aid
), ),
filtered_max_views AS ( ranked_snapshots AS (
-- views SELECT
SELECT fs.*,
aid, ROW_NUMBER() OVER (PARTITION BY fs.aid ORDER BY fs.created_at DESC) as rn,
max_views MAX(fs.views) OVER (PARTITION BY fs.aid) as max_views_per_aid
FROM FROM
max_views_per_aid filtered_snapshots fs
WHERE INNER JOIN
(max_views >= 90000 AND max_views < 100000) OR songs s ON fs.aid = s.aid
(max_views >= 900000 AND max_views < 1000000)
) )
-- SELECT
SELECT rs.id, rs.created_at, rs.views, rs.coins, rs.likes, rs.favorites, rs.shares, rs.danmakus, rs.aid, rs.replies
vs.* FROM
FROM ranked_snapshots rs
video_snapshot vs WHERE
INNER JOIN rs.rn = 1;
filtered_max_views fmv
ON
vs.aid = fmv.aid AND vs.views = fmv.max_views
`); `);
return queryResult.rows.map((row) => { return queryResult.rows.map((row) => {
return { return {