Вычислить средний вес пользователей - PullRequest
1 голос
/ 24 сентября 2008

У меня есть две таблицы: Пользователи и DoctorVisit

Пользователь - Идентификатор пользователя - Имя

DoctorsVisit - Идентификатор пользователя - вес - Дата

Таблица doctorVisit содержит все посещения, которые конкретный пользователь совершил с врачом. Вес пользователя записывается за посещение.

Запрос: Суммируйте вес всех пользователей, используя номера последнего посещения врача. (затем разделите на количество пользователей, чтобы получить средний вес)

Примечание: некоторые пользователи, возможно, вообще не посещали доктора, в то время как другие могли посещать его много раз.

Мне нужен средний вес всех пользователей, но используется последний вес.

Обновление

Я хочу средний вес для всех пользователей.

Ответы [ 7 ]

4 голосов
/ 24 сентября 2008

Если я правильно понимаю ваш вопрос, вы сможете получить средний вес всех пользователей на основе их последнего посещения из следующей инструкции 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

Следует отметить, что это предполагает наличие уникального идентификатора пользователя, который можно использовать для определения уникальности. Кроме того, если DateVisited не включает время, а только дату, один пациент, который посещает дважды в один и тот же день, может исказить данные.

0 голосов
/ 24 сентября 2008

Вот мой ответ на решение:

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 в их последнем посещении врачей. Это среднее значение искажается, если у кого-либо из пользователей было более одного посещения в одну и ту же дату, и если последняя дата относится к числу тех дат, когда пользователь получил парик несколько раз.

0 голосов
/ 24 сентября 2008

Если вы используете 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

Как уже упоминал кто-то, это средний вес для всех пользователей, которые посетили врача. Если вам нужен средний вес для ВСЕХ пользователей, то любой, кто не посещает врача, даст неверное среднее значение.

0 голосов
/ 24 сентября 2008

Я думаю, что это сработает, хотя я могу ошибаться:

Используйте внутренний выбор, чтобы убедиться, что у вас самый последний визит, затем используйте AVG . Ваша таблица Пользователь в этом примере является излишней: поскольку у вас нет данных о весе, и вы не заботитесь об именах пользователей, вам бесполезно ее просматривать.

SELECT AVG(dv.Weight) 
FROM DoctorsVisit dv
WHERE dv.Date = (
      SELECT MAX(Date)
        FROM DoctorsVisit innerdv
       WHERE innerdv.UserID = dv.UserID
  )
0 голосов
/ 24 сентября 2008

Я думаю, что в ваших спецификациях есть ошибка.

Если вы поделите на всех пользователей, ваше среднее значение будет слишком низким. Каждый пользователь, у которого нет посещений врача, будет стремиться подтянуть среднее значение к нулю. Я не верю, что ты этого хочешь.

Я слишком ленив, чтобы придумать реальный запрос, но это будет одна из тех вещей, когда вы будете использовать самостоятельное соединение между базовой таблицей и запросом с группой, которая вытягивает все соответствующие идентификаторы Дата посещения пар из базовой таблицы. Единственное, для чего вам нужна таблица User - это Имя.

У нас здесь был образец той же проблемы пару недель назад, я думаю. Под «той же проблемой» я подразумеваю проблему, когда мы хотим получить атрибут представителя группы, но когда нужный нам атрибут не включен в предложение group by.

0 голосов
/ 24 сентября 2008

Напишите запрос, чтобы выбрать самый последний вес для каждого пользователя (QueryA), и используйте этот запрос в качестве внутреннего выбора запроса для выбора среднего (QueryB), например,

SELECT AVG(weight) FROM (QueryA)
0 голосов
/ 24 сентября 2008

Это даст вам средний вес на пользователя, если они посетили:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...