根据学生运动的数据,sql统计上个月每天参与运动的人有多少。
SELECT
sum( count )
FROM
(
SELECT
count( DISTINCT studentId ) AS count,
date_format( from_unixtime( createDate / 1000 ), '%Y-%m-%d' ) AS date
FROM
sp_student sss
where
sss.createDate >= #{startTime}
and sss.createDate <= #{endTime}
GROUP BY
date ) t
SELECT date, COUNT(participants) AS num_participants
FROM activity_data
WHERE date >= DATEADD(month, -1, GETDATE()) AND date < GETDATE()
GROUP BY date
ORDER BY date ASC;
SELECT
date,
COUNT(*) AS num
FROM exercise_records
WHERE date BETWEEN '2019-11-01' AND '2019-11-30'
GROUP BY date
ORDER BY date;
SELECT DATE(sports_date) AS date, COUNT(DISTINCT id) AS renshu
FROM student_sports
WHERE YEAR(sports_date) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(sports_date) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
GROUP BY DATE(sports_date)
ORDER BY DATE(sports_date);
我可以通过以下SQL语句来统计上个月每天参与运动的学生人数:
SELECT DATE_FORMAT(date, '%Y-%m-%d') AS day, COUNT(DISTINCT student_id) AS num_of_students
FROM sport_data
WHERE date >= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY)
AND date <= LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH))
GROUP BY day;
其中,sport_data
为数据表名,包含的字段为 date
和 student_id
,分别表示学生参与运动的日期和学生ID。
具体解释如下:
DATE_FORMAT(date, '%Y-%m-%d') AS day
:将日期格式化为年月日的形式,并将其作为结果集中的字段名取名为 day
。COUNT(DISTINCT student_id) AS num_of_students
:统计每天参与运动的学生人数并将其作为结果集中的字段名取名为 num_of_students
。WHERE
语句中,date >= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY)
表示从上上个月的最后一天开始计算,date <= LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH))
表示到上个月的最后一天结束计算。GROUP BY day
:按照日期分组统计结果。这样就可以得到一个按照日期统计学生参与运动人数的结果,例如:
+------------+-----------------+
| day | num_of_students |
+------------+-----------------+
| 2022-01-01 | 20 |
| 2022-01-02 | 18 |
| 2022-01-03 | 17 |
| ... | ... |
| 2022-01-31 | 22 |
+------------+-----------------+
其中的 day
列为按照年月日格式化后的日期,num_of_students列为当天参与运动的学生人数。注意,这里的结果集中每天都有结果,即使某一天没有学生参与运动,该天的统计结果为 0。
需要注意的是,上述 SQL 语句中使用了 MySQL 特有的 DATE_FORMAT()
、DATE_ADD()
、LAST_DAY()
等函数,因此在不同的数据库中可能需要稍作修改。
参考资料: