fix: inefficient SQL query for getting songs close to milestone
This commit is contained in:
parent
8158ce10c0
commit
fabb77d98d
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user