我有下表:
studentid VARCHAR(12)
latetime DATETIME
attendance CHAR(1)
晚些时候只有工作日。
有些日子,学生将有“家长信”,由V表示出席栏目。
我需要连续工作日将这些出勤列V分组。 然后计算这些事件。 每组连续天数计为1个字母。
我的SQLFIDDLE:http://sqlfiddle.com/#!2/55d5b/1
此SQLFIDDLE示例数据应返回
STUDENTID LETTERCOUNT
a1111 3
b2222 2
a1111 - 3 counts
-----
1. 2014-01-02
2. 2014-01-27
2. 2014-01-29 and 2014-01-30
b2222 - 2 counts
-----
1. 2014-01-02 and 2014-01-03
2. 2014-01-24, 2014-01-27 and 2014-01-28
我尝试了以下SO的各种方法,但没有任何正确的结果:
How to GROUP BY consecutive data (date in this case)
MySQL: group by consecutive days and count groups
我可以通过循环遍历结果并手动检查每条记录+下一个日期,以编程方式在PHP中执行此操作。但我试图用SQL实现同样的目标。
我们非常感谢您寻求解决方案的任何帮助/方向。
答案 0 :(得分:0)
这源自MySQL: group by consecutive days and count groups中的一个答案。我添加了WITH ROLLUP
选项以将字母计数放入同一查询中,并使用GROUP_CONCAT
显示所有日期。我在工作日以INTERVAL
为条件,跳过周末;不过,假期不会被考虑在内。
在我的小提琴版本中,我将latetime
列更改为date
,因此我可以从SQL中删除所有DATE()
函数。
SELECT studentid, IFNULL(dates, '') dates, IF(dates IS NULL, lettercount, '') lettercount
FROM (
SELECT studentid, dates, COUNT(*) lettercount
FROM (
SELECT v.studentid,
GROUP_CONCAT(latetime ORDER BY latetime SEPARATOR ', ') dates
FROM
(SELECT studentid, latetime,
@start_date := IF(@last_student IS NULL OR @last_student <> studentid,
1,
IF(@last_latetime IS NULL
OR (latetime - INTERVAL IF(WEEKDAY(latetime) = 0, 3, 1) DAY) > @last_latetime, latetime, @start_date)) AS start_date,
@last_latetime := latetime,
@last_student := studentid
FROM
studentattendance, (SELECT @start_date := NULL, @last_latetime := NULL, @last_student := NULL) vars
WHERE attendance = 'V'
ORDER BY
studentid, latetime
) v
GROUP BY
v.studentid, start_date) x
GROUP BY studentid, dates WITH ROLLUP) y
WHERE studentid IS NOT NULL
ORDER BY studentid, dates