2009-03-10 21 views
0

bir tablo şöyle sahiptir: Bu özel (örneğin bu sonucu isteyentoplaması Kolon (SQL) Bölüm 1

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

, 1 object_ids ve 2, bir grubun bir parçası, başka bir yerde tanımlandığı gibidir burada

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

[eklenen 15:05] 10 oy toplamı içindir:., ve ben toplamı her zaman 1. object_id 3 kullanılmayan bir grubun parçası olduğu = böylece) normalized_score arıyorum object_id in (1,2). Başka bir mantık kümesi var, (1,2), sadece en temiz soruyu sormaya çalışıyordum, bu yüzden insanlar o kısım hakkında endişelenmek zorunda değiller.

[eklendi 3:10] Açıklamalarda belirtildiği gibi, nesnelerden birinin puanı 0'ın altındaysa, bir sorun ortaya çıkar. İşte kural, "Eğer herhangi bir outcome_id skoru -x ise, VE set için minimum skor, minimum skoru sıfırlamak için tüm skorlara ADD x" denir. Bunu SQL'in dışında kendi zamanımda yapabilirim - bu yüzden birileri sadece SQL'de ele almak için birer tane varsa, bu bir bonus.

Kendim birleştirme yaparsam, toplamı alabilirim. Normalleştirilmiş toplamı nasıl alacağımı anlayamıyorum. İdeal olarak bu hem MySQL 5.x hem de Sqlite3'te çalışacaktır. Aksi takdirde, bunu iki ayrı sorguyla yapabilirim ve sadece işi post-processing'de yapabilirim.

+0

"10" buradaki şeylere nereden geliyor? –

+0

Eğer oyların 10'un üzerinde olması gerekiyorsa o zaman olumsuz oylara nasıl izin verebilirsiniz? –

+0

Üzgünüz 10, object_id oyununda (1,2) bulunan oyların toplamıdır. –

cevap

1

negatif oy telafi etmeden çözüm (ben bunu içerdiğinden onun çok daha kolay anlamak/okumak için):

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

Tam çözüm:

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 

(I don' MySQL'e erişimim var, bu yüzden Oracle'da bir sorgu yazdım ve || + için değiştirin. Umarım MySQL'de çalışır veya en azından yardımcı olur :))

+0

Evet - Bir alt sorgunun gerekli olduğunu düşünüyordum. Genellikle bunlardan kaçınmaya çalışıyorum ve eminim ki bir alt sorgusuz çözüm var, ama bu birkaç yüz binden az kayıt için yeterince iyi olmalıydı - ki bu da şimdilik iyi. Harika bir cevap için teşekkürler. –

1

Yorumlar oldukça doğru .. ama 10'un burnunuzdan aldığınız bir sayı olduğu varsayımını yapacağım.

NesneKimliği SUM (oy) AS object_id SEÇ + Object_id

TARAFINDAN tablo TOPLULUĞU NormalizedVote GİBİ '/ 10' keyfini çıkarın.

+0

Üzgünüm, net değildim. '10', o gruptaki tüm oyların toplamıdır - aksi takdirde bu önemsiz bir soru olacaktır. Soruyu güncelleyeceğim. –

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

Yanıt olarak işaretlenmiş olana benzer şekilde (bir tanesi düzeltilebilir olsa da), SUM(), çalışmayan object_id = 3 için oyları içerir. Bunun bir alt sorgusu olmasına sevmiyorum - giriş için teşekkürler. –