在這個例子中,我們有一個包含各種事件的資料庫,所有事件都用 uuid 存盤。
我們的目標是計算 uuid 的初始時間戳與具有相同 uuid 的下一條記錄的第一個時間戳之間的差異(以分鐘為單位)。
現在,我們正在使用多個 SQL 陳述句在代碼中手動執行此操作,由于使用率高導致問題,因此我們開始快取結果,但是,要求是實時的。
現在我試圖找出一種方法讓資料庫服務器在單個 SQL 陳述句中完成作業。
我嘗試了各種加入結果的方法,但沒有運氣。有人知道可能有一些模式魔法可以幫助我們解決這個問題。任何建議,將不勝感激!
| 用戶名 | 郵票 |
|---|---|
| 0df8-e817-050c-d0ce-06c0-53d6-8f99-c636 | 2021-11-29 15:39:52.000000 |
| 0df8-e817-050c-d0ce-06c0-53d6-8f99-c636 | 2021-11-29 15:33:43.000000 |
| 0df8-e817-050c-d0ce-06c0-53d6-8f99-c636 | 2021-11-29 15:32:26.000000 |
| 0a44-e1c3-efc9-6183-8afb-c39c-ee9d-7b75 | 2021-11-29 14:30:58.000000 |
| ffda-f1ee-ad99-1f9a-16e0-30e6-1ba8-9022 | 2021-11-23 22:00:50.000000 |
| ffda-f1ee-ad99-1f9a-16e0-30e6-1ba8-9022 | 2021-11-23 22:00:37.000000 |
| ffda-f1ee-ad99-1f9a-16e0-30e6-1ba8-9022 | 2021-11-23 21:51:30.000000 |
| fbcd-d8db-777e-f736-00db-f011-b239-2fb7 | 2021-11-23 19:43:06.000000 |
| fbcd-d8db-777e-f736-00db-f011-b239-2fb7 | 2021-11-23 19:26:52.000000 |
| fbcd-d8db-777e-f736-00db-f011-b239-2fb7 | 2021-11-23 19:24:30.000000 |
以0df8-e817-050c-d0ce-06c0-53d6-8f99-c636為例,最低時間戳為:
2021-11-29 15:32:26.000000
第一個跟進時間戳是:
2021-11-29 15:39:52.000000
看起來很簡單,可以在幾分鐘內獲得差異......但是一個單一的 SQL 陳述句解決方案逃脫了我。
uj5u.com熱心網友回復:
對于支持視窗函式的 MySql 版本,您可以使用自聯接和聚合來獲得最低和下一個時間戳,并TIMESTAMPDIFF()獲得它們的差異:
SELECT t1.uuid,
TIMESTAMPDIFF(MINUTE, MIN(t1.stamp), MIN(t2.stamp)) diff
FROM tablename t1 LEFT JOIN tablename t2
ON t2.uuid = t1.uuid AND t1.stamp < t2.stamp
GROUP BY t1.uuid;
請參閱演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/369704.html
