我有一個類似的資料集:
桌子 TIMELINE
| 學生卡 | course_id | 日期 | 進步 |
|---|---|---|---|
| 50 | 1 | 2022-01-01 | 0.1 |
| 50 | 1 | 2022-01-02 | 0.3 |
| 50 | 1 | 2022-01-03 | 0.7 |
| 50 | 3 | 2022-01-01 | 0.2 |
| 50 | 3 | 2022-01-02 | 0.3 |
| 50 | 3 | 2022-01-03 | 0.9 |
| 73 | 2 | 2022-01-01 | 0.1 |
| 73 | 2 | 2022-01-02 | 0.4 |
這已經是一個查詢(因此,最終查詢中的一個子查詢),它通過時間戳對所有進度進行分組。我只是按DATE(and student_idand course_id) 分組并得到了MAX(progress),以便將粒度設定為
STUDENT - COURSE - DATE。
我需要為每門課程的每個學生檢索每天的進度。
所以,在那種情況下:
| 學生卡 | course_id | 日期 | 進步 | progress_of_day |
|---|---|---|---|---|
| 50 | 1 | 2022-01-01 | 0.1 | 0.1 |
| 50 | 1 | 2022-01-02 | 0.3 | 0.2 |
| 50 | 1 | 2022-01-03 | 0.7 | 0.4 |
| …… | ...... | ...... | ...... | ...... |
是當天取得的progress of day進展減去前一天取得的進展
我設法使用帶有條件的簡單 JOIN 來完成這項作業:
timeline t1 LEFT JOIN timeline t2
ON t1.student_id = t2.student_id
AND t1.course_id = t2.course_id
AND t1.date > t2.date ## <---- THE SOLUTION BUT ALSO THE PROBLEM
所以我可以MAX(progress)擺脫t1和MAX(progress)擺脫t2并簡單地減去它們
但這表現不佳。實際上,我不能使用它,timeline表很大,我們唯一的索引是 on student_id,所以比較每一行之間的日期是瘋狂的。我設法與一些學生和 LIMIT 一起完成了這項作業。
預期結果:我會達到同樣的效果,但表現良好。
我知道也許可以使用@variables,但我不知道如何繼續。
想法?
謝謝
uj5u.com熱心網友回復:
SELECT student_id,
course_id,
`date`,
CASE WHEN @group = CONCAT(student_id, '-', course_id)
THEN CAST(progress - @progress AS DECIMAL(2,1))
ELSE progress
END progress_of_day,
@group := CONCAT(student_id, '-', course_id),
@progress := progress progress
FROM timeline
CROSS JOIN ( SELECT @group := '', @progress := 0 ) variables
ORDER BY student_id, course_id, `date`
https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=650b940341e91b266fdd626bd4766566
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/417203.html
標籤:
