每次用户创建案例时,我都有一个具有唯一键的表:
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个条目进入此表。
答案 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。