لدي عميل لديه حالة استخدام غريبة ويريد أن يتمكن TOP من إدارة مسابقة.
بدأت من discourse/app/models/top_topic.rb at main · discourse/discourse · GitHub واستخدمت الكود أدناه، لكنه لا يطابق TOP. هل هناك شيء واضح أغفلته؟ فكرتي البديلة هي مجرد سحب ملفات JSON يوميًا عبر مهمة مجدولة (cron job) وكتابة سكريبت لتحويل JSON إلى CSV للبيانات التي يريدونها.
-- [params]
-- date :start_date = '2019-05-01'
-- date :stop_date = '2019-05-30'
-- int :log_views_multiplier = 2
-- int :least_likes_per_post_multiplier = 3
-- int :num_topics = 100
WITH top_topics AS(
SELECT t.like_count likes_count,
p.like_count score,
t.id topic_id,
t.posts_count posts_count,
p.like_count op_likes_count,
t.title topic_name,
t.views views_count,
p.user_id user_id,
t.category_id category_id
FROM topics t
JOIN posts p ON p.topic_id = t.id AND p.post_number = 1
WHERE t.created_at > to_date(:start_date, 'YYYY-MM-DD')
AND t.created_at < to_date(:stop_date, 'YYYY-MM-DD')
),
top AS (
SELECT log(GREATEST(views_count, 1)) * :log_views_multiplier +
op_likes_count * 0.5 +
CASE WHEN top_topics.likes_count > 0 AND top_topics.posts_count > 0
THEN
LEAST(top_topics.likes_count / top_topics.posts_count, :least_likes_per_post_multiplier )
ELSE 0
END +
CASE WHEN topics.posts_count < 10 THEN
0 - ((10 - topics.posts_count) / 20) * op_likes_count
ELSE
10
END +
log(GREATEST(top_topics.posts_count, 1))
AS score,
topic_id
FROM top_topics
LEFT JOIN topics ON topics.id = top_topics.topic_id AND
topics.deleted_at IS NULL
)
select topic_id,topic_name, t.user_id, u.username, likes_count, category_id
from top_topics t
left join users u
on t.user_id = u.id
order by likes_count desc
limit :num_topics