MYSQL选择平均条目数

时间:2014-02-25 14:44:54

标签: mysql

每次用户创建案例时,我都有一个具有唯一键的表:

id|doctor_id|created_dt
--|---------|-----------
 1|23       |datetimestamp
 2|23       |datetimestamp
 3|17       |datetimestamp

如何选择并返回用户每月的平均条目数量?

我试过这个:

SELECT avg (id)
FROM `cases`
WHERE created_dt BETWEEN DATE_SUB(CURDATE(),INTERVAL 90 DAY) AND CURDATE() 
and doctor_id = 17

但是这会返回一个非常大的值,这是不可能的。

澄清一下:我正试图让医生ID 17每月平均有2个条目进入此表。

4 个答案:

答案 0 :(得分:2)

我认为你被“平均”的想法所抛弃了。您不需要平均ID或平均user_id。您希望表中的平均条目数,因此您可以使用COUNT()

SELECT count(id)/3 AS AverageMonthlyCases
FROM `cases`
WHERE created_dt BETWEEN DATE_SUB(CURDATE(),INTERVAL 90 DAY) AND CURDATE() 
group by doctor_id 

由于您有90天的间隔,因此您需要计算每30天的行数或计数/ 3。

答案 1 :(得分:2)

SELECT AVG(cnt), user_id
FROM (
   SELECT COUNT(id) cnt, user_id
   FROM cases
   WHERE created_dt BETWEEN <yourDateInterval>
   GROUP BY user_id, year(created_dt), month(created_dt)
)

答案 2 :(得分:1)

由于你需要平均条目数,AVG函数不是真的适用,因为它是SUM()/ COUNT(),显然你不需要它(为什么你需要SUM的Σ)。

你需要这样的东西

SELECT 
    doctor_id, 
    DATE(created_dt,'%m-%Y') AS month, 
    COUNT(id) AS visits
FROM `cases`
GROUP BY 
    `doctor_id`, 
    DATE(created_dt,'%m-%Y')
ORDER BY
    `doctor_id` ASC, 
    DATE(created_dt,'%m-%Y') ASC

每位医生每月访问一次。如果你想平均它,你可以使用像

这样的东西
SELECT 
    doctor_id, 
    SUM(visits)/COUNT(month) AS `average` 
FROM (
    SELECT 
        doctor_id, 
        DATE(created_dt,'%m-%Y') AS month, 
        COUNT(id) AS visits
    FROM `cases`
    GROUP BY 
        `doctor_id`, 
        DATE(created_dt,'%m-%Y')
    ORDER BY
        `doctor_id` ASC, 
        DATE(created_dt,'%m-%Y') ASC
    ) t1
GROUP BY
    doctor_id

显然,您可以添加WHERE子句,因为此查询可兼容多年(即不会将2013年1月和2014年1月计为一个月)。

此外,考虑到医生是否有“空白”月份,他没有任何患者,因此不会计算那些月份(0可以破坏和平均)。

答案 3 :(得分:0)

使用此功能,您可以按月对每位医生的总ID进行分组。

 Select monthname(created_dt), doctor_id, count(id) as total from cases group by 1,2 order by 1

此外,您可以使用 GROUP_CONCAT()作为嵌套查询,以便部署像表一样的数据透视表,其中每列都是doctor_id。