如何根据其他行计算列的相对值?

时间:2014-05-06 10:34:41

标签: sql sql-server

今天工作时遇到类似的情况。 让我们假设有表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))
    
  5. 那么如何计算这种相对列类型的字段。我是sql东西的新手。 请帮忙。

2 个答案:

答案 0 :(得分: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 :(得分: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

此查询使用与Gordon几乎相同的原则,并显示(几乎)与您在OP中发布的结果相同的结果。

但我不明白为什么RelativeScore = 5,其中AID = 6;根据你的规则(正如我所理解的那样),它应该返回3,因为AID = 4的IndividualScore小于AID = 6的IndividualScore。