@@ -10,7 +10,7 @@ export class LeaderboardRepository {
10
10
async getUserLeaderboard ( sort : UserLeaderboardSortType , dateRange : number , limit : number ) {
11
11
try {
12
12
const pastDateKST = getKSTDateStringWithOffset ( - dateRange * 24 * 60 ) ;
13
- const cteQuery = this . buildLeaderboardCteQuery ( dateRange ) ;
13
+ const cteQuery = this . buildLeaderboardCteQuery ( dateRange , pastDateKST ) ;
14
14
15
15
const query = `
16
16
${ cteQuery }
@@ -21,15 +21,16 @@ export class LeaderboardRepository {
21
21
COALESCE(SUM(ts.today_view), 0) AS total_views,
22
22
COALESCE(SUM(ts.today_like), 0) AS total_likes,
23
23
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,
26
26
COUNT(DISTINCT CASE WHEN p.released_at >= '${ pastDateKST } ' AND p.is_active = true THEN p.id END) AS post_diff
27
27
FROM users_user u
28
28
LEFT JOIN posts_post p ON p.user_id = u.id
29
29
LEFT JOIN today_stats ts ON ts.post_id = p.id
30
30
LEFT JOIN start_stats ss ON ss.post_id = p.id
31
31
WHERE u.username IS NOT NULL
32
32
GROUP BY u.id, u.email, u.username
33
+ HAVING SUM(COALESCE(ss.start_view, 0)) != 0
33
34
ORDER BY ${ this . SORT_COL_MAPPING [ sort ] } DESC, u.id
34
35
LIMIT $1;
35
36
` ;
@@ -44,7 +45,8 @@ export class LeaderboardRepository {
44
45
45
46
async getPostLeaderboard ( sort : PostLeaderboardSortType , dateRange : number , limit : number ) {
46
47
try {
47
- const cteQuery = this . buildLeaderboardCteQuery ( dateRange ) ;
48
+ const pastDateKST = getKSTDateStringWithOffset ( - dateRange * 24 * 60 ) ;
49
+ const cteQuery = this . buildLeaderboardCteQuery ( dateRange , pastDateKST ) ;
48
50
49
51
const query = `
50
52
${ cteQuery }
@@ -56,13 +58,18 @@ export class LeaderboardRepository {
56
58
u.username AS username,
57
59
COALESCE(ts.today_view, 0) AS total_views,
58
60
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
61
63
FROM posts_post p
62
64
LEFT JOIN users_user u ON u.id = p.user_id
63
65
LEFT JOIN today_stats ts ON ts.post_id = p.id
64
66
LEFT JOIN start_stats ss ON ss.post_id = p.id
65
67
WHERE p.is_active = true
68
+ AND (
69
+ p.released_at >= '${ pastDateKST } '
70
+ OR
71
+ ss.post_id IS NOT NULL
72
+ )
66
73
ORDER BY ${ this . SORT_COL_MAPPING [ sort ] } DESC, p.id
67
74
LIMIT $1;
68
75
` ;
@@ -76,10 +83,16 @@ export class LeaderboardRepository {
76
83
}
77
84
78
85
// 오늘 날짜와 기준 날짜의 통계를 가져오는 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
+ }
83
96
84
97
return `
85
98
WITH
@@ -89,17 +102,15 @@ export class LeaderboardRepository {
89
102
daily_view_count AS today_view,
90
103
daily_like_count AS today_like
91
104
FROM posts_postdailystatistics
92
- WHERE date <= '${ nowDateKST } '
93
- ORDER BY post_id, date DESC
105
+ WHERE date = '${ nowDateKST } '
94
106
),
95
107
start_stats AS (
96
108
SELECT DISTINCT ON (post_id)
97
109
post_id,
98
110
daily_view_count AS start_view,
99
111
daily_like_count AS start_like
100
112
FROM posts_postdailystatistics
101
- WHERE date >= '${ pastDateKST } '
102
- ORDER BY post_id, date ASC
113
+ WHERE date = '${ pastDateKST } '
103
114
)
104
115
` ;
105
116
}
0 commit comments