计算用户的平均重量

时间:2008-09-24 12:31:18

标签: sql sql-server

我有两个表,Users和DoctorVisit

用户 - 用户身份 - 姓名

DoctorsVisit - 用户身份 - 重量 - 日期

doctorVisit表包含特定用户对医生的所有访问。 每次访问记录用户的体重。

查询:使用最后一位医生的访问号码来总结所有用户的体重。 (然后除以用户数来得到平均体重)

注意:有些用户可能根本没有去过医生,有些用户可能已多次访问过。

我需要所有用户的平均体重,但需要使用最新的体重。

更新

我想要所有用户的平均分数。

7 个答案:

答案 0 :(得分:4)

如果我正确理解了您的问题,您应该能够根据上次访问以下SQL语句获得所有用户的平均权重。我们使用子查询将最后一次访问作为过滤器。

SELECT avg(uv.weight) FROM (SELECT weight FROM uservisit uv INNER JOIN
(SELECT userid, MAX(dateVisited) DateVisited FROM uservisit GROUP BY userid) us 
ON us.UserID = uv.UserId and us.DateVisited = uv.DateVisited

我应该指出,这确实假设有一个唯一的UserID可用于确定唯一性。此外,如果DateVisited不包括时间而只包括日期,那么在同一天访问两次的患者可能会扭曲数据。

答案 1 :(得分:0)

如果他们访问过,这应该可以获得每位用户的平均权重:

select user.name, temp.AvgWeight
from user left outer join (select userid, avg(weight)
            from doctorsvisit
            group by userid) temp
    on user.userid = temp.userid

答案 2 :(得分:0)

编写查询以选择每个用户的最新权重(QueryA),并将该查询用作查询的内部选择以选择平均值(QueryB),例如,

SELECT AVG(weight) FROM (QueryA)

答案 3 :(得分:0)

我认为你的规格有误。

如果除以所有用户,则平均值太低。没有医生访问的每个用户都倾向于将平均值拉向零。我不相信这就是你想要的。

我懒得想出一个实际的查询,但是这将是你在基表和带有组的查询之间使用自联接的东西之一,它会拉出所有相关的Id,从基表访问日期对。您需要User表的唯一内容是名称。

我想,几周前我们在这里有一个相同问题的样本。 “同一个问题”,我的意思是我们想要一个组代表属性的问题,但我们想要的属性不包含在group by子句中。

答案 4 :(得分:0)

我认为这会奏效,但我可能错了:

使用内部选择确保您拥有最近的访问次数,然后使用 AVG 。此示例中的用户表格是多余的:由于您没有重量数据,并且您不关心用户名,因此检查它并不是一件好事。

SELECT AVG(dv.Weight) 
FROM DoctorsVisit dv
WHERE dv.Date = (
      SELECT MAX(Date)
        FROM DoctorsVisit innerdv
       WHERE innerdv.UserID = dv.UserID
  )

答案 5 :(得分:0)

如果您使用的是SQL Server 2005,则不需要GROUP BY上的子查询 您可以使用新的ROW_NUMBER和PARTION BY功能。

SELECT AVG(a.weight)  FROM
(select
    ROW_NUMBER() OVER(PARTITION BY dv.UserId ORDER BY Date desc) as ID,
    dv.weight     
from 
    DoctorsVisit dv) a   
WHERE a.Id = 1

正如其他人提到的那样,这是所有访问过医生的用户的平均分数。如果你想要所有用户的平均体重,那么任何不去看医生的人都会给出误导性的平均值。

答案 6 :(得分:0)

这是我对解决方案的准备:

select
    avg(a.Weight) as AverageWeight
from
    DoctorsVisit as a
innner join
    (select 
        UserID,
        max (Date) as LatestDate
     from
        DoctorsVisit
     group by
        UserID) as b
     on a.UserID = b.UserID and a.Date = b.LatestDate;

请注意,根本不使用User表。

这个平均值完全忽略了根本没有医生就诊的用户,或者在最近的医生访问中其体重被记录为NULL的用户。如果任何用户在同一日期有多次访问,并且最新日期是用户多次吵醒的日期之一,则此平均值会出现偏差。