如果不同的列为true,则替换列的值

时间:2016-02-01 19:30:42

标签: sql sql-server database

在我的查询中,我的结果大致如下:

id     isCorrect    value
1       0            100
1       0            101
2       1            80
2       0            100
2       0            120
3       1            1
3       1            1

我的结果必须是这样的:

id     isCorrect    value
1        0           100.5
1        0           100.5
2        1           80
2        0           80
2        0           80
3        1           1
3        1           1

在英语中,对于给定的id,我希望isCorrect = 1的值替换该id的其他值。如果没有isCorrect行,我想平均它们。

据我所知,我正在使用rank()函数为我提供1行,例如:

SELECT id, isCorrect, value, rank() over (partition by id order by isCorrect DESC) as correctRank from foo

哪会给我

id     isCorrect     value    correctRank
1       0             100      1
1       0             101      1
2       1             80       1
2       0             100      3
2       0             120      3
3       1             1        1
3       1             1        1

我已经找到了从哪里去的路障。

2 个答案:

答案 0 :(得分:3)

您可以使用窗口函数获得所需的结果:

SELECT id, isCorrect,          
       CASE 
          WHEN MAX(isCorrect) OVER (PARTITION BY id ORDER BY isCorrect DESC) = 1
             THEN FIRST_VALUE([value]) OVER (PARTITION BY id ORDER BY isCorrect DESC)
          ELSE AVG([value]*1.0) OVER (PARTITION BY id)      
       END AS [value]
FROM mytable

Demo here

答案 1 :(得分:1)

我会这样说:

{{1}}

我认为此代码几乎是您规则的直接翻译。如果有正确的值,则使用它。否则,取平均值。