檢索MySQL SELECT 語句中的列差異
在MySQL 中,取得SELECT 語句中兩行值之間的差異涉及使用適當的方法選擇和連接技術。讓我們檢查這個問題並探索可用的解決方案。
提供的表格包含按 ID、公里、日期、汽車 ID、汽車駕駛員等組織的行。要正確對錶進行排序,需要使用帶有 ORDER BY 的 SELECT 語句使用子句,產生排序表。
接下來,目標是建立一個包含附加列「number_km_since_last_date」的視圖,提供自上次記錄日期以來的公里數。一種方法採用 INNER JOIN,但由於未排序的行而面臨挑戰。
使用 LEFT JOIN 和子查詢:
更有效的方法涉及使用 LEFT JOIN 組合與子查詢。子查詢從同一個表中選擇小於目前行日期的最大日期。透過將目前行與最大前一行連接起來,可以使用表達式「mt1.Kilometers - IFNULL(mt2.Kilometers, 0)」計算以公里為單位的差值。產生的SQL 查詢是:
SELECT mt1.ID, mt1.Kilometers, mt1.date, mt1.Kilometers - IFNULL(mt2.Kilometers, 0) AS number_km_since_last_date FROM myTable mt1 LEFT JOIN myTable mt2 ON mt2.Date = ( SELECT MAX(Date) FROM myTable mt3 WHERE mt3.Date < mt1.Date ) ORDER BY mt1.date
使用MySQL Hack 模擬LAG() 函數:
另一種技術利用模擬lag() 函數,該函數不是本機的MySQL 中支援。使用者定義的變數 @kilo 被初始化為零。在查詢中處理每一行時,將從 @kilo 的當前值中減去其公里數,然後將 @kilo 更新為當前公里數。這有效地提供了自上一行以來的公里數差異。結果查詢是:
SET @kilo=0; SELECT mt1.ID, mt1.Kilometers - @kilo AS number_km_since_last_date, @kilo := mt1.Kilometers Kilometers, mt1.date FROM myTable mt1 ORDER BY mt1.date
以上是如何計算MySQL中連續行的值之間的差異?的詳細內容。更多資訊請關注PHP中文網其他相關文章!