2009-03-10 2 views
0

나는 테이블과 같이이 :이 특정 (예를 들어,이 결과를 원하는롤업 열 (SQL) 제 1

object_id | vote 
1 | 2 
1 | -1 
1 | 5 
2 | 3 
2 | 1 
3 | 4 
3 | -2 

, 1 object_id에, 2는 그룹의 일부, 다른 곳에서 정의 된 여기

object_id | normalized_score 
1 | 6/10 
2 | 4/10 

[추가 오후 3시 5분] (10) 투표의 합계이다. 그리고 나는 합은 항상 1 OBJECT_ID (3)가 사용되지 않은 그룹의 일부입니다 = 있도록)를 normalized_score을 찾고 있어요 object_id in (1,2). (1,2)가 나오기위한 또 다른 논리가 있습니다. 사람들이 그 부분에 대해 걱정할 필요가 없도록 가장 깨끗한 질문을하려고했습니다.

[added 3:10 PM] 의견에서 지적한 바와 같이, 개체 중 하나에 대한 점수가 0 미만이면 문제가 발생합니다. "임의의 outcome_id에 대한 점수가 -x이고 최소 점수 인 경우 최소 점수를 제로화하기 위해 모든 점수에 x를 추가하십시오."규칙이 있습니다. 나는 SQL의 외부에서 자신의 시간에 이것을 할 수있다 - 누군가가 SQL에서 그것을 다루려고 노력할 때만 보너스가된다.

내가 자기 조인을하면 합계를 얻을 수 있습니다. 정규화 된 합계를 얻는 방법을 알 수 없습니다. 이상적으로 이것은 MySQL 5.x 및 Sqlite3 모두에서 작동합니다. 그렇지 않으면 두 개의 별도 쿼리로이 작업을 수행 할 수 있으며 후 처리 작업 만 수행하면됩니다.

+0

여기서 "10"은 어디로 들어 옵니까? –

+0

투표가 10이 아닌 것으로 예상되는 경우 어떻게하면 부정 투표를 허용 할 수 있습니까? –

+0

죄송합니다. 10은 (1,2)에 object_id가있는 투표의 합계입니다. 질문을 업데이트하겠습니다. –

답변

1

부정 투표에 대한 보상이없는 솔루션 (I이 하나를 포함 때문에 훨씬 쉽게/이해 읽는) :

SELECT object_id 
,  SUM(vote) + '/' + total AS normalized_score 
FROM tabel 
,  (
     SELECT sum(vote) AS total 
     FROM tabel 
     ) 
GROUP BY object_id, total 

전체 솔루션 :

SELECT object_id 
,  SUM(vote + minvote) + '/' + (total + minvote * count) AS normalized_score 
FROM tabel 
,  (
     SELECT sum(vote) AS total 
     ,  CASE WHEN MIN(vote) < 0 THEN 
        -MIN(vote) 
       END AS minvote 
     ,  COUNT(*) AS count 
     FROM tabel 
     ) 
GROUP BY object_id, total, minvote, count 

(내가 돈 ' MySQL에 액세스 할 수 있으므로 Oracle에서 쿼리를 작성하고 +를 대체했습니다. MySQL에서 작동하거나 적어도 도움이 되었기를 바랍니다.)

+0

예 - 하위 쿼리가 필요하다고 생각했습니다. 나는 대개 그런 것들을 피하려고 노력하고 있으며, 부차적 인 해결책이 없다고 확신하지만, 그것은 수십만 개의 레코드보다 적어야한다. 이것은 현재 괜찮다. 좋은 답변 주셔서 감사합니다. –

1

의견이 맞습니다.하지만 10은 당신이 코에서 뽑은 숫자입니다.

이 OBJECTID, SUM (투표) AS OBJECT_ID SELECT + OBJECT_ID

BY 테이블 그룹에서 NormalizedVote AS '/ 10'즐길 수 있습니다.

+0

죄송합니다. 명확하지 않았습니다. '10'은 해당 그룹의 다른 모든 투표의 합계입니다. 그렇지 않으면 사소한 질문입니다. 나는 그 질문을 갱신 할 것이다. –

1
 
-- SQL solution 
SELECT 
    object_id AS ObjectID, 
    (SUM(CASE SIGN(vote) WHEN 1 THEN vote ELSE 0 END) - 
    ((CASE SIGN(MIN(vote)) WHEN -1 THEN MIN(vote) ELSE 0) * 
    (COUNT(1)))) + '/10' AS NormalizedVote 
FROM table 
GROUP BY object_id 
+0

대답으로 표시 한 것과 비슷하지만 (해결할 수 있음에도 불구하고) SUM()에는 object_id = 3에 대한 투표가 포함되어 작동하지 않습니다. 비록 하위 쿼리가 없다고 생각합니다. - 입력에 감사드립니다. –