@@ -10,7 +10,7 @@ export class LeaderboardRepository {
1010 async getUserLeaderboard ( sort : UserLeaderboardSortType , dateRange : number , limit : number ) {
1111 try {
1212 const pastDateKST = getKSTDateStringWithOffset ( - dateRange * 24 * 60 ) ;
13- const cteQuery = this . buildLeaderboardCteQuery ( dateRange ) ;
13+ const cteQuery = this . buildLeaderboardCteQuery ( dateRange , pastDateKST ) ;
1414
1515 const query = `
1616 ${ cteQuery }
@@ -21,15 +21,16 @@ export class LeaderboardRepository {
2121 COALESCE(SUM(ts.today_view), 0) AS total_views,
2222 COALESCE(SUM(ts.today_like), 0) AS total_likes,
2323 COUNT(DISTINCT CASE WHEN p.is_active = true THEN p.id END) AS total_posts,
24- SUM(COALESCE(ts.today_view, 0) - COALESCE(ss.start_view, COALESCE(ts.today_view, 0) )) AS view_diff,
25- SUM(COALESCE(ts.today_like, 0) - COALESCE(ss.start_like, COALESCE(ts.today_like, 0) )) AS like_diff,
24+ SUM(COALESCE(ts.today_view, 0) - COALESCE(ss.start_view, 0 )) AS view_diff,
25+ SUM(COALESCE(ts.today_like, 0) - COALESCE(ss.start_like, 0 )) AS like_diff,
2626 COUNT(DISTINCT CASE WHEN p.released_at >= '${ pastDateKST } ' AND p.is_active = true THEN p.id END) AS post_diff
2727 FROM users_user u
2828 LEFT JOIN posts_post p ON p.user_id = u.id
2929 LEFT JOIN today_stats ts ON ts.post_id = p.id
3030 LEFT JOIN start_stats ss ON ss.post_id = p.id
3131 WHERE u.username IS NOT NULL
3232 GROUP BY u.id, u.email, u.username
33+ HAVING SUM(COALESCE(ss.start_view, 0)) != 0
3334 ORDER BY ${ this . SORT_COL_MAPPING [ sort ] } DESC, u.id
3435 LIMIT $1;
3536 ` ;
@@ -44,7 +45,8 @@ export class LeaderboardRepository {
4445
4546 async getPostLeaderboard ( sort : PostLeaderboardSortType , dateRange : number , limit : number ) {
4647 try {
47- const cteQuery = this . buildLeaderboardCteQuery ( dateRange ) ;
48+ const pastDateKST = getKSTDateStringWithOffset ( - dateRange * 24 * 60 ) ;
49+ const cteQuery = this . buildLeaderboardCteQuery ( dateRange , pastDateKST ) ;
4850
4951 const query = `
5052 ${ cteQuery }
@@ -56,13 +58,18 @@ export class LeaderboardRepository {
5658 u.username AS username,
5759 COALESCE(ts.today_view, 0) AS total_views,
5860 COALESCE(ts.today_like, 0) AS total_likes,
59- COALESCE(ts.today_view, 0) - COALESCE(ss.start_view, COALESCE(ts.today_view, 0) ) AS view_diff,
60- COALESCE(ts.today_like, 0) - COALESCE(ss.start_like, COALESCE(ts.today_like, 0) ) AS like_diff
61+ COALESCE(ts.today_view, 0) - COALESCE(ss.start_view, 0 ) AS view_diff,
62+ COALESCE(ts.today_like, 0) - COALESCE(ss.start_like, 0 ) AS like_diff
6163 FROM posts_post p
6264 LEFT JOIN users_user u ON u.id = p.user_id
6365 LEFT JOIN today_stats ts ON ts.post_id = p.id
6466 LEFT JOIN start_stats ss ON ss.post_id = p.id
6567 WHERE p.is_active = true
68+ AND (
69+ p.released_at >= '${ pastDateKST } '
70+ OR
71+ ss.post_id IS NOT NULL
72+ )
6673 ORDER BY ${ this . SORT_COL_MAPPING [ sort ] } DESC, p.id
6774 LIMIT $1;
6875 ` ;
@@ -76,10 +83,16 @@ export class LeaderboardRepository {
7683 }
7784
7885 // 오늘 날짜와 기준 날짜의 통계를 가져오는 CTE(임시 결과 집합) 쿼리 빌드
79- private buildLeaderboardCteQuery ( dateRange : number ) {
80- const nowDateKST = getCurrentKSTDateString ( ) ;
81- // 과거 날짜 계산 (dateRange일 전)
82- const pastDateKST = getKSTDateStringWithOffset ( - dateRange * 24 * 60 ) ;
86+ private buildLeaderboardCteQuery ( dateRange : number , pastDateKST ?: string ) {
87+ // KST 기준 00시~01시 (UTC 15:00~16:00) 사이라면 전날 데이터를 사용
88+ const nowDateKST =
89+ new Date ( ) . getUTCHours ( ) === 15
90+ ? getKSTDateStringWithOffset ( - 24 * 60 ) // 전날 데이터
91+ : getCurrentKSTDateString ( ) ;
92+
93+ if ( ! pastDateKST ) {
94+ pastDateKST = getKSTDateStringWithOffset ( - dateRange * 24 * 60 ) ;
95+ }
8396
8497 return `
8598 WITH
@@ -89,17 +102,15 @@ export class LeaderboardRepository {
89102 daily_view_count AS today_view,
90103 daily_like_count AS today_like
91104 FROM posts_postdailystatistics
92- WHERE date <= '${ nowDateKST } '
93- ORDER BY post_id, date DESC
105+ WHERE date = '${ nowDateKST } '
94106 ),
95107 start_stats AS (
96108 SELECT DISTINCT ON (post_id)
97109 post_id,
98110 daily_view_count AS start_view,
99111 daily_like_count AS start_like
100112 FROM posts_postdailystatistics
101- WHERE date >= '${ pastDateKST } '
102- ORDER BY post_id, date ASC
113+ WHERE date = '${ pastDateKST } '
103114 )
104115 ` ;
105116 }
0 commit comments