SQL统计用户题目组合下低分记录到最新记录的间隔行数
核心需求
- 按「用户+题目」维度统计,返回自最后一条得分≤250的低分记录出现后,到该用户对应题目最新答题记录之间经过的答题迭代行数。
现有实现
目前已编写一版执行效率较高的SQL,可输出部分预期字段,但尚未完成行数统计的需求,代码如下:
SELECT uq1.UserID, uq1.QuestionID, r.LastAttempt, r.Score, r.DateSeen, s.LastBad, s.Score AS ScoreUnder, s.DateSeen AS DateScoreUnder FROM users_questions uq1 LEFT JOIN ( SELECT uq2.QuestionID, uq2.UserID, MAX(UsersQuestionsID) LastAttempt, uq2.Score, uq2.DateSeen FROM users_questions uq2 GROUP BY uq2.UserID, uq2.QuestionID ) AS r ON r.QuestionID = uq1.QuestionID AND r.UserID = uq1.UserID LEFT JOIN ( SELECT uq3.QuestionID, uq3.UserID, MAX(UsersQuestionsID) LastBad, uq3.Score, uq3.DateSeen FROM users_questions uq3 WHERE uq3.Score <= 250 GROUP BY uq3.UserID, uq3.QuestionID ) AS s ON s.QuestionID = uq1.QuestionID AND s.UserID = uq1.UserID GROUP BY uq1.UserID, uq1.QuestionID
现有代码已能输出每个用户每道题的最新答题记录、最后一条低分答题记录的相关信息,缺少的统计逻辑为:计算每个「用户+题目」组合下,最后一条低分记录到最新记录之间的答题行数。
测试数据
测试用users_questions表样例数据如下:
| UsersQuestionsID | Score | DateSeen | UserID | QuestionID |
|---|---|---|---|---|
| 1 | 877 | 2022-06-25 19:51:18 | 14 | 98 |
| 2 | 765 | 2022-06-25 15:52:42 | 14 | 99 |
| 3 | 345 | 2022-06-25 15:54:22 | 14 | 99 |
| 4 | 754 | 2022-06-25 15:54:22 | 14 | 107 |
| 5 | 222 | 2022-06-25 16:11:40 | 13 | 73 |
| 6 | 525 | 2022-06-25 16:11:40 | 13 | 55 |
| 7 | 23 | 2022-06-25 16:11:40 | 13 | 130 |
| 8 | 888 | 2022-06-25 16:11:40 | 13 | 104 |
| 9 | 234 | 2022-07-01 12:41:44 | 14 | 94 |
| 10 | 564 | 2022-07-01 12:41:44 | 14 | 106 |
| 11 | 0 | 2022-07-01 13:59:37 | 14 | 99 |
| 12 | 267 | 2022-07-01 16:57:40 | 14 | 99 |
| 13 | 345 | 2022-07-02 15:17:03 | 13 | 99 |
| 14 | 49 | 2022-07-02 17:44:19 | 14 | 99 |
| 15 | 222 | 2022-07-02 18:10:17 | 14 | 99 |
| 16 | 49 | 2022-07-02 18:10:43 | 14 | 94 |
| 17 | 1000 | 2022-07-02 18:11:18 | 14 | 106 |
| 18 | 0 | 2022-07-06 14:18:51 | 14 | 94 |
内容的提问来源于stack exchange,提问作者Peter Gordon
相关产品推荐
相关产品推荐

