ai_member_xiaoxi/scripts/l2_pass_time.py
2026-05-07 08:00:01 +08:00

85 lines
2.8 KiB
Python

#!/usr/bin/env python3
"""L2 每个课时首次通关耗时统计"""
import psycopg2
import sys
conn = psycopg2.connect(
host="bj-postgres-16pob4sg.sql.tencentcdb.com",
port=28591,
user="ai_member",
password="LdfjdjL83h3h3^$&**YGG*",
dbname="vala_bi"
)
cur = conn.cursor()
# 获取 L2 所有章节
cur.execute("""
SELECT id, course_season, course_unit, course_lesson
FROM bi_level_unit_lesson
WHERE course_level = 'L2'
ORDER BY course_season, course_unit, course_lesson
""")
chapters = cur.fetchall()
results = []
for cid, season, unit, lesson in chapters:
# 从8张分表收集该章节的首次完成记录
first_dones = {} # (user_id, chapter_unique_id) -> first_done_time
for tbl_idx in range(8):
cur.execute(f"""
SELECT user_id, chapter_unique_id, MIN(created_at)
FROM bi_user_chapter_play_record_{tbl_idx}
WHERE play_status = 1 AND chapter_id = {cid}
GROUP BY user_id, chapter_unique_id
""")
for row in cur.fetchall():
uid, cu_id, ts = row
key = (uid, cu_id)
if key not in first_dones or ts < first_dones[key][0]:
first_dones[key] = (ts, cu_id)
if not first_dones:
results.append((season, unit, lesson, cid, 0, 0.0))
continue
# 对每个首次完成记录,统计组件总耗时
total_times = []
for (uid, cu_id), (_, cu_id) in first_dones.items():
total_ms = 0
for comp_idx in range(8):
cur.execute(f"""
SELECT COALESCE(SUM(interval_time), 0)
FROM bi_user_component_play_record_{comp_idx}
WHERE chapter_unique_id = %s
""", (cu_id,))
total_ms += cur.fetchone()[0] or 0
total_times.append(total_ms)
avg_min = sum(total_times) / len(total_times) / 60000.0
results.append((season, unit, lesson, cid, len(total_times), round(avg_min, 1)))
print(f" {season} {unit} {lesson} (id={cid}): {len(total_times)}人, 平均{round(avg_min, 1)}分钟")
# 输出汇总
print("\n===== 汇总 =====")
print(f"{'Season':<6} {'Unit':<6} {'Lesson':<8} {'ChapterID':<10} {'完成人数':<10} {'平均用时(分钟)':<15}")
for r in results:
print(f"{r[0]:<6} {r[1]:<6} {r[2]:<8} {r[3]:<10} {r[4]:<10} {r[5]:<15}")
# 按单元汇总
from collections import defaultdict
unit_stats = defaultdict(lambda: {"count": 0, "avg": 0.0, "lessons": 0})
for r in results:
key = f"{r[0]}_{r[1]}"
unit_stats[key]["count"] += r[4]
unit_stats[key]["avg"] += r[5]
unit_stats[key]["lessons"] += 1
print("\n===== 按单元汇总 =====")
print(f"{'Unit':<10} {'完成人数(合计)':<15} {'平均用时(分钟)':<15}")
for key, stats in sorted(unit_stats.items()):
print(f"{key:<10} {stats['count']:<15} {round(stats['avg']/stats['lessons'], 1):<15}")
cur.close()
conn.close()