sql-server - 选择跨列的前 n 个值并求平均值

标签 sql-server t-sql sql-server-2000

我有一个包含 13 列 的表,其中一个为 varchar(25) 类型,其余为 `int 类型(保存一年中每个月的值) 。

对于每一行,我想从 12 列 中选取前 6 个 int 值并计算这些值的平均值。

我知道如何从给定列中选择前 n 个,但是如何在多个列中执行此操作?

最佳答案

select ID,
       (
       select avg(C)
       from (
            select top(6) C
            from (values(C1),(C2),(C3),(C4),(C5),(C6),(C7),
                        (C8),(C9),(C10),(C11),(C12)) as T(C)
            order by C desc
            ) as T
       ) as C
from YourTable

SQL Fiddle

对于 SQL Server 2005,它看起来像这样,因为您不能使用 Table Value Constructor

select ID,
       (
       select avg(C)
       from (
            select top(6) C
            from (select C1 union all
                  select C2 union all
                  select C3 union all
                  select C4 union all
                  select C5 union all
                  select C6 union all
                  select C7 union all
                  select C8 union all
                  select C9 union all
                  select C10 union all
                  select C11 union all
                  select C12) as T(C)
            order by C desc
            ) as T
       ) as C
from YourTable

SQL Fiddle

对于 SQL Server 2000,这可能适合您。

select T1.ID,
       avg(C) as C
from (
     select ID, C1 as C from YourTable union all
     select ID, C2  from YourTable union all
     select ID, C3  from YourTable union all
     select ID, C4  from YourTable union all
     select ID, C5  from YourTable union all
     select ID, C6  from YourTable union all
     select ID, C7  from YourTable union all
     select ID, C8  from YourTable union all
     select ID, C9  from YourTable union all
     select ID, C10 from YourTable union all
     select ID, C11 from YourTable union all
     select ID, C12 from YourTable
     ) as T1
where (
      select count(*)
      from (
           select ID, C1 as C from YourTable union all
           select ID, C2  from YourTable union all
           select ID, C3  from YourTable union all
           select ID, C4  from YourTable union all
           select ID, C5  from YourTable union all
           select ID, C6  from YourTable union all
           select ID, C7  from YourTable union all
           select ID, C8  from YourTable union all
           select ID, C9  from YourTable union all
           select ID, C10 from YourTable union all
           select ID, C11 from YourTable union all
           select ID, C12 from YourTable
           ) as T2
      where T1.ID = T2.ID and
            T1.C <= T2.C
      ) <= 6
group by T1.ID

SQL Fiddle

我不认为这会特别快。也许更好的选择是将中间结果存储在临时表中。

create table #T
(
  ID varchar(25),
  C int
)

insert into #T
select ID, C1 as C from YourTable union all
select ID, C2  from YourTable union all
select ID, C3  from YourTable union all
select ID, C4  from YourTable union all
select ID, C5  from YourTable union all
select ID, C6  from YourTable union all
select ID, C7  from YourTable union all
select ID, C8  from YourTable union all
select ID, C9  from YourTable union all
select ID, C10 from YourTable union all
select ID, C11 from YourTable union all
select ID, C12 from YourTable

select T1.ID,
       avg(C) as C
from #T as T1
where (
      select count(*)
      from #T as T2
      where T1.ID = T2.ID and
            T1.C <= T2.C
      ) <=  6 
group by T1.ID  

drop table #T

关于sql-server - 选择跨列的前 n 个值并求平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18320564/

相关文章:

sql - 按日期对 sql 中的项目进行排名

sql - 查找上周日

sql-server - SQL Server 中的索引

java - 从 Java 通过 Windows 身份验证连接到 SQL Server 2005 时,用户 '' 登录失败

sql - 通过通配符扩展将星号符号编辑到 SSMS 中的列名列表中

sql - 在 SQL Server 中创建索引时收到警告消息

sql - 如何在 SQL 中旋转或旋转字符串表中的列

SQL Server 查询 : what is the meaning of 'N' preceding a string?

SQL Server 使用正则表达式查询?

sql-server - SQL Server 的 printf