source

가중치 있는 액션과 시간 감소를 기준으로 사용자의 순위를 매기기 위해 SQL 쿼리를 작성하는 방법은 무엇입니까?

factcode 2022. 9. 13. 22:03
반응형

가중치 있는 액션과 시간 감소를 기준으로 사용자의 순위를 매기기 위해 SQL 쿼리를 작성하는 방법은 무엇입니까?

사용자의 순위를 매기기 위해 사용하고 싶은 액션(A와 B)이 2개 있습니다.

두 작업 모두 시간이 경과함에 따라 선형적으로 값을 "잃어버립니다".

액션 A: 중량 60 %

액션 B: 무게 40 %

점수 = SUM [액션 무게 * 1000000 / (현재 타임스탬프 - 액션 타임스탬프)]

사용자의 작업이 포함된 MySQL 테이블

user_id | action | timestamp
1       | A      | 1524428013410
1       | B      | 1525431531237
2       | B      | 1525578131563

가장 높은 점수를 받은 사용자는 랭킹 상위권에 있어야 합니다.

성능 SQL 쿼리를 작성하여 사용자의 점수를 계산하는 방법은 무엇입니까?

쿼리 출력은 다음 형식이어야 합니다.

user_id | score
1       | 0.92830
2       | 0.76382

(상기 예의 점수는 필요한 출력 포맷의 플레이스 홀더일 뿐입니다).

감사합니다!

내가 제대로 이해한다면 넌 평범한 사람이 필요해GROUP BY.넌 할 수 있다.JOIN무게사용하다ORDER BY정렬할 수 있습니다.테이블이 호출된 경우action_user.

SELECT au.`user_id`,
       sum(a.`weight` / (current_timestamp() - au.`timestamp`)) `score`
       FROM `action_user` au
            INNER JOIN (SELECT 'A' `action`,
                               .6 `weight`
                        UNION ALL
                        SELECT 'B' `action`,
                               .4 `weight`) a
                       ON a.`action` = au.`action`
       GROUP BY au.`user_id`
       ORDER BY 2 DESC;

공식은 잘 모르겠지만아주 적은 숫자입니다.필요에 따라 변경할 수도 있습니다.

다음과 같은 경우:

   SELECT
        user_id,
        sum( IF(a.`action` = 'a', 0.6, 0.4) * 1000 / TIMESTAMPDIFF(second, a.timestamp, now()) ),

    FROM actions a

    group by user_id

언급URL : https://stackoverflow.com/questions/50196110/how-to-write-a-sql-query-to-rank-users-based-on-weighted-actions-and-time-decay

반응형