• 首先我把代码写复杂了,不用参考我的
  • 代码思想:首先分样本标记,采用聚合函数统计各时刻的最大人数,选择与19.00最接近的时刻,挑选最大值作为19.00最大人数
  • 错误:
  • 1、方法复杂了,该方法仅适合搜寻所有时刻最大人数,如果只搜索某时刻人数,则可直接根据时间BETWEEN来判断
  • 2、MAX(num)如果是针对某一时刻的用户,应该采用MAX还是MIN才更为合适,MAX可能找寻当时时刻最大的人数,MIN可能寻找当时时刻初最少的人数时刻末的最少人数,即同一时刻人数发生变化,先衡量谁题目没有给明
  • 3、该方法没有分天进行统计,即将不同天数但满足时刻的用户可能会进行累加,不符合实际情况
WITH t1 AS(
    SELECT user_id
            , course_id
            , in_datetime AS dt
            , 1 AS status
    FROM attend_tb
    UNION ALL
    SELECT user_id
            , course_id
            , out_datetime AS dt
            , -1 AS status
    FROM attend_tb
), t2 AS(
    SELECT course_id, course_name
            , DENSE_RANK() OVER(PARTITION BY course_id, course_name ORDER BY dt DESC) dt1
            , SUM(status) OVER(PARTITION BY course_id, course_name ORDER BY dt, status DESC) num
    FROM t1
    JOIN course_tb USING(course_id)
    WHERE DATE_FORMAT(dt,'%H:%i') <= '19:00'
)

SELECT course_id, course_name
        ,MAX(num)
FROM t2
WHERE dt1 = 1
GROUP BY course_id, course_name