2015-01-29 5 views
-1

나는 행이 파티를 나타내는 간단한 SQL (PostgreSQL 또는 MySQL) 테이블을 가지고있는 반면, 컬럼은 선거에서받은 득표 수를 나타냅니다. D'Hondt method을 사용하여 각 당 (즉, 새 열)에 좌석 수 (n)를 할당하고 싶습니다.D' Hondt 메서드를 구현하여 SQL에서 투표 수를 할당하는 방법은 무엇입니까?

어떤 절차 (또는 함수)를 써야합니까?

업데이트 : 4 석 assumming 원하는 출력, 예를 할당 할 :

  votes allocated_seats 

party1  47000   2 
party2  16000   1 
party3  15900   1 

좌석이 (D' Hondt 법)과 같이 할당된다 : 각 당사자
위한 계산 V/(S + 1) 파티
의 득표 수 : V가 좌석이 이미 당 가장 높은 값

파티에 할당이 자리를 수신하고 프로세스가 모든 좌석까지 시작됩니다는 거라고된다 istibuted.
시트 1 :
party1 47000/(0 + 1) = 47000
party2 16000/(0 + 1) = 16000
party3 15900/(+ 1 0) = 그래서 위의 예에서

15900
party1 좌석 수신

좌석 (2) :
party1 47000/(1 + 1) = 23500
party2 16000/(0 + 1) = 16000
party3 15900/(0 + 1) = 15900
파티가 바다를받습니다. t

시트 3 :
party1 47000/(2 + 1) = 15,666
party2 16000/(0 + 1) = 16000
party3 15900/(0 + 1) = 15900
party2 좌석 수신

시트 4 :
party1 47000/(2 + 1) = 15,666
party2 16000/(1 + 1) = 8000
party3 15900/(0 + 1) = 15900
party3 좌석 수신

+2

. . 질문에 대한 답변을 원하면 샘플 데이터와 문제 해결 프로세스를 보여줄 것을 권합니다. –

+0

작성 절차에 관해서는 DBMS가 ** 큰 ** 차이를 만듭니다.따라서 MySQL 또는 Postgres를 사용할지 결정해야합니다. –

+0

@GordonLinoff : 당신 말이 맞습니다. 연결된 위키 피 디아 페이지는 좋은 예를 보여줍니다. – Viktor

답변

1

는 PostgreSQL의에서, 당신이하는 기능을 필요로하지 않는 간단한 update 그것을 할 수 있습니다

update dhont 
set seats = coalesce(calculated.seats, 0) 
from dhont as parties 
left join (
    select party, count(*) as seats 
    from (
    select  party 
    from  dhont 
    cross join generate_series(1, :seat_count) as divisor 
    order by cast(votes as decimal)/divisor desc 
    limit  :seat_count 
) as seat_labels 
    group by party 
) as calculated on parties.party = calculated.party 
where parties.party = dhont.party 

SQLFiddle

을 :이 샘플 데이터입니다. 실제 join 조건의 경우 파티 이름이 아닌 테이블의 기본 키 (또는 적어도 고유 키)를 사용하십시오.

MySQL too에서는 이론상 동일하지만 어색한 것은 workaround입니다.

+0

고마워, 내 문제에 대한 간단하고 우아한 솔루션처럼 보입니다! – Viktor