2014-05-06 71 views
1

今天工作時,我得到了類似的情況。 讓我們假設有表tblActor。我們需要更新演員的相對得分是相同的,其他演員的個人得分的總和:如何根據其他行計算列的相對值?

  1. 如果任何其他行爲屬於不同城市當前的演員,然後其他演員的個人得分將是零。
  2. 如果有其他演員屬於同一城市,且其個人分數小於或等於當前演員,則其他演員的個人分數將爲零。
  3. 如果有其他演員屬於同一城市,且其個人分數大於當前演員,則其他演員的個人分數將爲 (其他演員個人分數 - 當前演員個人分數)。
  4. 同一演員的得分將是演員的個人得分。

    Aid City IndividualScore  Relative Score 
        1  X    1    (1 + (2-1) + (3 -1) + 0 + 0 + 0) 
        2  X    2    (0 + 2 + (3 -2) + 0 + 0 + 0) 
        3  X    3    (0 + 0 + 3 + 0 + 0 + 0) 
        4  Y    2    (0 + 0 + 0 + 2 + 0 + (3-2)) 
        5  Y    0    (0 + 0 + 0 + 2 + 0 + (3-0)) 
        6  Y    3    (0 + 0 + 0 + 2 + 0 + 3)) 
    

那麼如何計算這個相對列領域的一種。我是新的SQL的東西。 請幫忙。

+0

試圖理解你的代碼,你確定相對分數是正確的 ?我認爲最後一行應該是3,就像@ GunnarKnudsen的回答 –

+0

規則1似乎表明該分數是區域性的 - >同一個演員在不同地區/城市應該有不同的分數,因爲它會改變其他演員分數,一般來說sql查詢的規則應該在表單中,如果某個東西是當前的,而不是當前的則其他 – Serpiton

回答

1

試試這個

select 
    a.AID 
, a.City 
, a.IndividualScore 
, a.IndividualScore 
    + sum(case when oa.IndividualScore > a.IndividualScore then oa.IndividualScore - a.IndividualScore else 0 end) as RelativeScore 
from tblActor a 
left join tblActoroa on a.City = oa.City-- other actor 
where a.AID != oa.AID 
group by 
    a.AID 
, a.City 
, a.IndividualScore 

此查詢使用幾乎相同的原則,戈登,表示了(幾乎)與您在OP中發佈的結果相同。

但是我不明白爲什麼RelativeScore = 5,其中AID = 6;根據你的規則(我已經理解他們),它應該返回3,因爲AID = 4的IndividualScore小於那麼IndividualScore的AID = 6。

1

該規則基本上是:「總結給定演員和同一城市中其他演員獲得更高分數的所有其他演員之間的分數差異」。唉,你不能完全做到這一點的窗函數內,但是你可以用一個自聯接:

select t.aid, t.city, t.IndividualScore, 
     (t.IndividualScore + sum(t2.IndividualScore - t.IndividualScore)) as RelativeScore 
from table t left outer join 
    table t2 
    on t.city = t2.city and t.aid <> t2.aid and t.IndividualScore < t2.IndividualScore 
group by t.aid, t.city, t.IndividualScore; 
+1

顯示錯誤的結果。 – user3427540