- 首先我把代码写复杂了,不用参考我的
- 代码思想:首先分样本标记,采用聚合函数统计各时刻的最大人数,选择与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