sql - 在不包括当前行的SQL中计算Avg

标签 sql sql-server tsql average

我有一个数据库,其中某些记录用 ID 标记,我想创建一个 View ,其中包含所有具有相同 ID 的记录的平均值,不包括当前记录。例如,如果我的数据如下所示:

ROW - ID - Value
1     1    20
2     1    30
3     1    40
4     2    60
5     2    80
6     2    40
7     3    50
8     3    20
9     3    40

我的 View 需要计算具有相同 ID 的每一行的平均值,不包括它所在的行,所以我的输出看起来像这样:

ROW - ID - Value AVG
1     1    20    35
2     1    30    30
3     1    40    25
4     2    60    60
5     2    80    50
6     2    40    70
7     3    50    30
8     3    20    55
9     3    40    35

因此,在第 3 行的情况下,它提取了第 1 行和第 2 行,因为它们具有相同的 ID 并给出了它们的平均值 - 25。

我已经在这方面绕过房子有一段时间了,但似乎无法钉牢它。任何帮助将不胜感激。

最佳答案

一个选项,如果你有窗口函数

Declare @YourTable table (ROW int,ID int,Value int)
Insert Into @YourTable values
(1,     1,    20),
(2,     1,    30),
(3,     1,    40),
(4,     2,    60),
(5,     2,    80),
(6,     2,    40),
(7,     3,    50),
(8,     3,    20),
(9,     3,    40)

Select *
      ,Avg = (sum(value) over (Partition By ID)-Value)/NullIf((sum(1) over (Partition By ID)-1),0)
 From  @YourTable

另一种选择是外部应用

Select A.*
      ,B.*
 From  @YourTable A
 Outer Apply (Select Avg=avg(value) 
               From  @YourTable 
               where ID=A.ID and Row<>A.Row
              ) B

都返回

enter image description here

关于sql - 在不包括当前行的SQL中计算Avg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43144016/

相关文章:

sql - 无法连接到 SQL Server 2005

SQL:替换字符串中的特定字符

sql - OpenQuery 和使用动态 SQL

TSQL 用空字符串替换所有非 a-z/A-Z 字符

SQL - 根据最近日期更新记录

sql - 使用来自其他两个列的数据更新空列所有 varchar/text Postgresql

更新 MySQL 表的 PHP 代码

sql - 特殊情况需要计数记录

sql-server - 什么会导致 SQL Server 性能不佳?

sql - tSQL 不在查询中