다른 시간 범위에서 포인트 총계의 백분위 수 순위를 계산하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1007146

  •  06-07-2019
  •  | 
  •  

문제

PHP 및 Codeigniter 기반 웹 사이트에서 사용자는 스택 오버플로와 달리 다양한 작업으로 명성을 얻을 수 있습니다. 평판이 수여 될 때마다 MySQL 테이블에서 새로운 항목이 생성됩니다. user_id, 행동은 보상되고, 그 포인트의 가치 (예 : 10 평판). 동시에, a users 테이블, reputation_total, 업데이트되었습니다.

이 모든 것이 참조 프레임 없이는 의미가 없기 때문에 사용자에게 모든 사용자 중 백분위 수 순위를 보여주고 싶습니다. 총 평판의 경우 충분히 쉬운 것 같습니다. 내 말하자 user_id ~이다 1138. 사용자 수를 계산합니다 users a reputation_total 내 것보다 적은 수의 사용자 수를 세고 나누어 나보다 평판이 낮은 사용자의 백분율을 찾으십시오. 그것은 사용자 1138의 백분위 수 순위가 될 것입니다. 쉬운!

그러나 나는 또한 지난 7 일 동안 얻은 다른 시간에 걸쳐 평판 총계를 표시하고 있으며, 여기에는 평판 테이블을 쿼리하고 주어진 날짜 이후로 얻은 모든 포인트를 합산하는 것이 포함됩니다. 또한 다른 시간 범위의 백분위 수 순위를 보여주고 싶습니다. EG, EEG, 전반적으로 11 번째 백분위 수가 될 수 있지만 이번 달 50 번째 백분위 수와 오늘 97 번째 백분위 수는 97 번째 백분위 수를 보여주고 싶습니다.

주어진 시간 동안 모든 사용자의 평판을 찾아서 그 그룹 내에서 어디에 있는지 확인해야 할 것 같습니다. 그게 끔찍하게 번거롭지 않습니까? 이것을하는 가장 좋은 방법은 무엇입니까?

많은 감사합니다.

도움이 되었습니까?

해결책

여기에서 머리 꼭대기에서 몇 가지 옵션을 생각할 수 있습니다.

  1. 당신이 언급했듯이, 총 시간 범위에서 얻은 평판 포인트를 올리고 이에 따라 백분위 수 순위를 계산합니다.

  2. 매일 평판 _total에 대한 업데이트를 추적하므로 user_id, date, prication_total이있는 테이블이 있습니다.

  3. 각 시간 범위에 대해 사용자 테이블에 새 열을 추가하십시오 (평판_total, prication_total_today, precutation_total_last30days 등). 또한이를 별도의 테이블 (평판 _totals)으로 정규화하여 추적하려는 각 시간에 새 열을 추가하지 않아도됩니다.

옵션 #1이 가장 쉽지만 평판 트랜잭션 테이블에 행이 많으면 느리게 될 것입니다. 특히 실시간으로 계산 해야하는 경우에는 잘 확정되지 않습니다.

옵션 #2는 시간이 지남에 따라 더 많은 스토리지가 필요하지만 (하루에 사용자 당 1 행) 트랜잭션 테이블을 직접 쿼리하는 것보다 훨씬 빠를 것입니다.

옵션 #3은 덜 유연하지만 가장 빠른 옵션 일 수 있습니다.

옵션 2와 3은 모두 총계를 매일 계산하기 위해 배치 프로세스가 필요할 수 있으므로 고려해야 할 사항입니다.

나는 어떤 옵션도 반드시 최고라고 생각하지 않습니다. 모두 속도/저장 공간/복잡성/유연성의 다른 트레이드 오프를 포함합니다. 귀하가하는 일은 궁극적으로 귀하의 신청 요구 사항에 따라 다릅니다.

다른 팁

왜 그것이 너무 복잡한 지 모르겠습니다. 일반적으로 필요한 것은 다음과 같은 결과를 제한하는 쿼리를 Where 절에 추가하는 것입니다.

WHERE DatePosted between @StartOfRange and @EndOfRange
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top