Sql 计算用户的平均权重

Sql 计算用户的平均权重,sql,sql-server,Sql,Sql Server,我有两个表,Users和DoctorVisit 使用者 -用户ID -名字 博士访问 -用户ID -重量 -日期 doctorVisit表包含特定用户对医生进行的所有访问。 每次访问记录用户的体重 查询:使用上一次医生就诊的数字汇总所有用户的权重。然后除以用户数得到平均权重 注意:一些用户可能根本没有看过医生,而其他用户可能看过很多次 我需要所有用户的平均重量,但使用最新的重量 更新 我需要所有用户的平均重量。如果用户访问过以下站点,则应获得每个用户的平均重量: select user.name

我有两个表,Users和DoctorVisit

使用者 -用户ID -名字

博士访问 -用户ID -重量 -日期

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

查询:使用上一次医生就诊的数字汇总所有用户的权重。然后除以用户数得到平均权重

注意:一些用户可能根本没有看过医生,而其他用户可能看过很多次

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

更新


我需要所有用户的平均重量。

如果用户访问过以下站点,则应获得每个用户的平均重量:

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

如果用户访问过以下站点,则应获得每个用户的平均体重:

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

编写一个查询以选择每个用户查询的最新权重a,并将该查询用作查询的内部选择以选择平均查询b,例如

SELECT AVG(weight) FROM (QueryA)

编写一个查询以选择每个用户查询的最新权重a,并将该查询用作查询的内部选择以选择平均查询b,例如

SELECT AVG(weight) FROM (QueryA)

如果我正确理解了您的问题,您应该能够从下面的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

我应该指出,这确实假设存在一个唯一的用户ID,可以用来确定唯一性。此外,如果就诊日期不包含时间,而仅包含日期,则一名患者在同一天就诊两次可能会扭曲数据。

如果我正确理解您的问题,您应该能够从以下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

我应该指出,这确实假设存在一个唯一的用户ID,可以用来确定唯一性。此外,如果就诊日期不包括时间,而仅包括日期,则一名患者在同一天就诊两次可能会扭曲数据。

我认为您的规格中存在错误

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

我懒得提出一个实际的查询,但这将是其中的一个,在基表和一个查询之间使用自连接,该查询包含一个group by,从基表中提取所有相关的Id、Visit和Date对。用户表唯一需要的就是名称


我想,几周前我们在这里有一个相同问题的样本。同样的问题,我指的是我们想要一个组代表的属性,但是我们想要的属性没有包含在group By子句中的问题。

我认为您的规范中有错误

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

我懒得提出一个实际的查询,但这将是其中的一个,在基表和一个查询之间使用自连接,该查询包含一个group by,从基表中提取所有相关的Id、Visit和Date对。用户表唯一需要的就是名称


我想,几周前我们在这里有一个相同问题的样本。同样的问题,我指的是我们想要一个组代表的属性,但是我们想要的属性没有包含在group By子句中的问题。

我认为这会起作用,尽管我可能错了:

使用内部select确保您有最近的访问,然后使用AVG。本例中的用户表是多余的:因为您没有权重数据,也不关心用户名,所以检查它对您没有任何好处

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

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

使用内部select确保您有最近的访问,然后使用AVG。本例中的用户表是多余的:因为您没有权重数据,也不关心用户名,所以检查它对您没有任何好处

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

如果您使用的是SQLServer2005,则不需要对GROUPBY进行子查询。 您可以按功能使用新的行号和分区

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

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

如果您使用的是SQL Server 2005,则不需要对GROUP 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
正如其他人提到的,这是所有看过医生的用户的平均体重。如果您想要所有用户的平均重量
那么任何不去看医生的人都会给出一个误导性的平均值。

以下是我的解决方案:

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;
请注意,根本不使用用户表


这个平均值完全忽略了根本没有医生就诊的用户,或者在最近的医生就诊中体重记录为空的用户。如果任何用户在同一日期有一次以上的访问,并且如果最近的日期是用户被多次欺骗的日期之一,则该平均值是不正确的

以下是我的解决方案:

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;
请注意,根本不使用用户表



这个平均值完全忽略了根本没有医生就诊的用户,或者在最近的医生就诊中体重记录为空的用户。如果任何用户在同一日期有一次以上的访问,并且如果最近的日期是用户被多次欺骗的日期之一,则该平均值是不正确的

你需要所有用户的平均权重,还是一个医生就诊用户的平均权重?为什么要删除家庭作业标签以及一些评论?我认为删除家庭作业标签是可以的,但是,删除评论是不合适的。我保证,这不是家庭作业!我只删除人们认为这是家庭作业的评论。哈哈,我误读了标题。你需要所有用户的平均体重,还是需要一个医生就诊的用户的平均体重?为什么删除了家庭作业标签以及一些评论?我想删除家庭作业标签是可以的,但是,删除评论是不合适的。我保证这不是家庭作业!我只删除人们认为这是家庭作业的评论。哈哈,我误读了标题。我不认为这是被问到的。我想问题是最近一次看医生时的平均体重。我不认为这是被问到的。我认为问题是最近一组医生就诊的平均权重。这假设在UserId和datevisitored上有一个唯一的键,这应该是一个非常安全的假设,但是应该指出。我喜欢使用带有连接的子查询。效率很高。还有一个假设是同一个用户不会一天去看两次医生。这可能是一个安全的假设。这假设用户ID和DateVisited上有一个唯一的键,这应该是一个非常安全的假设-但是应该指出。我喜欢使用带有连接的子查询。效率很高。还有一个假设是同一个用户不会一天去看两次医生。这可能是一个安全的假设。我可以确保只计算权重>0时的值。我可以确保只计算权重>0时的值查询的内部选择=子查询查询的内部选择查询的内部选择=子查询