WITH t AS (
    SELECT
        r.uid,
        CONCAT(DATE(r.start_time), ':', i.tag) AS detail_item,
        CASE WHEN r.submit_time IS NULL THEN 1 ELSE 0 END AS incomplete,
        CASE WHEN r.submit_time IS NULL THEN 0 ELSE 1 END AS complete
    FROM exam_record r
    JOIN examination_info i
        ON r.exam_id = i.exam_id
    WHERE r.start_time >= '2021-01-01'
      AND r.start_time <  '2022-01-01'
)
SELECT
    uid,
    SUM(incomplete) AS incomplete_cnt,
    SUM(complete) AS complete_cnt,
    GROUP_CONCAT(
        DISTINCT detail_item
        ORDER BY detail_item
        SEPARATOR ';'
    ) AS detail
FROM t
GROUP BY uid
HAVING
    SUM(incomplete) > 1
    AND SUM(incomplete) < 5
    AND SUM(complete) >= 1
ORDER BY incomplete_cnt DESC;