SQL - 选择所有其他行的平均值的唯一行

时间:2012-02-17 11:28:48

标签: sql sql-server-2008

我正在努力处理一个我最初认为应该非常简单的SQL查询。

想象一个表Users使用UserID作为PK,使用列Age表示用户年龄:

    UserID     Age
    1          22
    2          34
    3          23
    4          19
    etc.

我希望能够指定UserID并返回该用户的年龄以及所有其他用户的平均年龄。例如,如果我指定UserID 1,那么我希望将返回集设置为:

   UserID      Age      AvgAge
   1           22       24.5

以下内容不起作用:( WHERE之前执行GROUP BY

  Select UserID, Age, Avg(Age) as 'AvgAge'
  From Users
  Where UserID = 1
  Group By UserId, Age

  UserID      Age      AvgAge    //Result set
  1           22       22

有人能把我推向正确的方向吗?

顺便说一句,在一个理想的世界中,平均年龄应该包括被指定为用户的想法是显示他们相对于其他人的平均年龄的年龄。

鉴于有1000多名用户,然后对所有用户取平均值对AvgAge数字没有实际差别,但是如果有人想用他们的解决方案来展示他们的SQL实力那么我'有兴趣看到它。

由于

6 个答案:

答案 0 :(得分:3)

declare @T table
(
  UserID int,
  Age int
)

insert into @T values
    (1,          22),
    (2,          34),
    (3,          23),
    (4,          19)

declare @UserID int = 1

select Age, (select avg(Age*1.0)
             from @T
             where UserID <> @UserID) as AvgAge
from @T
where UserID = @UserID

结果:

Age         AvgAge
----------- ---------------------------------------
22          25.333333

答案 1 :(得分:2)

此查询根据请求从平均值中排除具有指定ID的用户。你在你的例子中使用了MAX,这不会给你平均值,但如果MAX实际上是你想要的,你可以在这个查询中用AVG交换它,它会起作用。

 SELECT u.UserID, 
        u.Age,
        (SELECT AVG(uavg.Age)
           FROM Users uavg
          WHERE uavg.UserID != u.UserID) AS AvgAge
    FROM Users u
   WHERE u.UserID = 1

答案 2 :(得分:1)

使用您需要的avg表示平均值,max表示最大年龄:

Select 
 UserID, 
 Age, 
 (select Max(Age) from Users) as 'AvgAge'
  From Users
  Where UserID = 1

答案 3 :(得分:1)

SELECT 
    u.UserId, 
    u.Age, 
    b.AvgAge 
FROM 
    dbo.Users a, 
    (SELECT AVG(Age*1e0) as AvgAge FROM dbo.Users) as b

答案 4 :(得分:1)

  Select U.UserID, u.Age, sq.Age as 'AvgAge'
      From Users u
      join (select average(age) as Age from users) sq on 1=1
      Where UserID = 1
      Group By UserId, Age

答案 5 :(得分:1)

declare @T table (UserID int, Age int)  
insert into @T values(1,22),(2,34),(3,23),(4,19)  

declare @UserID int = 1 

;with a as
(
  select userid, Age, 
  avg(age * case when userid <> @userid then 1.0 end) over() 'AvgAge'
from @T             
)
select Age, AvgAge from a
where userid = @UserID