【问题标题】:How to get the average from 3 values on a table on SQL Server?如何从 SQL Server 表上的 3 个值中获取平均值?
【发布时间】:2026-02-02 01:35:01
【问题描述】:

我的数据库有以下情况:

        id:   |   second id:  |  value 
Row 1:  1     |    1          |   123
Row 2:  1     |    2          |   234
Row 3:  1     |    3          |   456
Row 4:  2     |    1          |   987
Row 5:  2     |    2          |   876
Row 6:  2     |    3          |   765
Row 7:  3     |    1          |   345
Row 8:  3     |    2          |   678
Row 9:  3     |    3          |   543
Row 10: 4     |    1          |   345 
...

对于每个 id,我有 3 个第二个 id,它们总是 1,2 和 3。 我需要做的是获取这 3 个值的平均值(考虑 id 的 3 个值)并获取它们的平均值。我需要用一张长表来做这个(我想知道创建一个特定的视图来做这个)。

欢迎任何帮助。

(对不起我的问题,但我真的是 SQL Server 的初学者)

【问题讨论】:

  • 我对 MSSQL 了解不多,但我知道 PostgreSQL 和 Oracle 都有窗口函数——即你可以调用avg(value) over (partition by second_id),它会得到你想要的。 MSSQL 有这样的东西吗?
  • 我需要一个新行,使用每个 id 的 3 个值的平均值,作为我应该拥有的第一个 id:id: 1 |第二个ID:平均|值:271
  • 对于第二个 id,我将拥有这个:id: 2 |第二个ID:平均|值:876

标签: sql sql-server average


【解决方案1】:

只需使用 AVG 并仅按每​​个 id 分组。

SELECT id, AVG(value)
FROM MyTable
GROUP BY id

【讨论】:

  • 哇,这真的很简单,我只是把它复杂化了。非常感谢大家对我的帮助。
【解决方案2】:

如果您没有任何类型的窗口函数,自联接也应该可以工作:

select id, second_id, value, avg_val_over_id
from(
    select id, second_id, value
    from table
    )a
join(
    select id, avg(value) as avg_val_over_id
    from table
    group by id
    )b
using(id);

【讨论】:

    【解决方案3】:

    我不确定我是否理解您的需求,但如果您想要每个 second_ids 的平均值,请尝试:

    SELECT second_id, AVG(value)
    FROM table
    GROUP BY second_id
    

    【讨论】:

      【解决方案4】:

      编辑:

      根据您的评论,尝试:

      SELECT id, AVG(value)
      FROM MyTable
      GROUP BY id
      

      【讨论】:

      • 我需要一个新行,使用每个 id 的 3 个值的平均值,作为我应该拥有的第一个 id:id: 1 |第二个ID:平均|值:271
      • 我认为它是在没有 [second id] 列的情况下进行分组,否则它将返回与示例中相同的数据
      【解决方案5】:

      如果您想要准确,请使用

      SELECT second_id, AVG(value*1) FROM table GROUP BY second_id 
      

      【讨论】:

        【解决方案6】:

        如果您想在输出中添加这些平均行,这样的方法可能会起作用(在这里,我正在创建内联示例数据,并将其别名为 T - 它可以轻松地从表中选择基本数据而是):

        select ID,COALESCE(CONVERT(varchar(10),subid),'avg'),AVG(val) from (
        select 1 as id,1 as subid,123 as val union all
        select 1,2,234 union all
        select 1,3,456 union all
        select 2,1,987 union all
        select 2,2,876 union all
        select 2,3,745
        ) t
        group by ID,subid with rollup
        having ID is not null
        

        结果:

        1   1   123
        1   2   234
        1   3   456
        1   avg 271
        2   1   987
        2   2   876
        2   3   745
        2   avg 869
        

        【讨论】: