WITH merged AS (
    SELECT
        b.user_id,
        c.course_name,
        b.course_id,
        b.if_vw,
        b.if_fav,
        b.if_sign,
        MAX(
            CASE
                WHEN TIMESTAMPDIFF(MINUTE, a.in_datetime, a.out_datetime) >= 10
                THEN 1
                ELSE 0
            END
        ) AS attend_10min_flag
    FROM behavior_tb b
    LEFT JOIN attend_tb a
        ON b.user_id = a.user_id
       AND b.course_id = a.course_id
    LEFT JOIN course_tb c
        ON b.course_id = c.course_id
    GROUP BY
        b.user_id,
        b.course_id,
        c.course_name,
        b.if_vw,
        b.if_fav,
        b.if_sign
)

SELECT
    course_id,
    course_name,
    ROUND(
        SUM(attend_10min_flag) * 100.0
        / COUNT(CASE WHEN if_sign = 1 THEN user_id END),
        2
    ) AS attend_rate
FROM merged
GROUP BY course_id, course_name
ORDER BY course_id;