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