在我的查询中,我的结果大致如下:
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
我已经找到了从哪里去的路障。
答案 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
答案 1 :(得分:1)
我会这样说:
{{1}}
我认为此代码几乎是您规则的直接翻译。如果有正确的值,则使用它。否则,取平均值。