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

标签 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

我遇到了一个障碍,不知道该往哪里走。

最佳答案

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

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

关于sql - 如果不同的列为 true,则替换列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35138706/

相关文章:

php - PHP 中使用 LIKE 和 WHERE 查询进行选择

mysql - 使用 SQL 中的条件选择每第 n 行

sql - 转换语句内的结果

sql - 为什么我不能在 T-SQL 中重用临时表?

sql - 试图构造一个SQL查询麻烦

java - 在Android中使用外部数据库文件

iphone - 在插入 iPhone 的 SQLite 数据库之前检查数据是否存在

mysql - LIKE '[charlist]%' 语法在 MySQL 中不起作用 (phpMyAdmin)

SQL FOR XML 路径,返回多个子元素

sql - 容纳一对多和一对多(或一对*)关系的最佳实践是什么?