我有两个表,Users和DoctorVisit
用户 - 用户身份 - 姓名
DoctorsVisit - 用户身份 - 重量 - 日期
doctorVisit表包含特定用户对医生的所有访问。 每次访问记录用户的体重。
查询:使用最后一位医生的访问号码来总结所有用户的体重。 (然后除以用户数来得到平均体重)
注意:有些用户可能根本没有去过医生,有些用户可能已多次访问过。
我需要所有用户的平均体重,但需要使用最新的体重。
更新
我想要所有用户的平均分数。
答案 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的用户。如果任何用户在同一日期有多次访问,并且最新日期是用户多次吵醒的日期之一,则此平均值会出现偏差。