原題是一位同窗的提問 mysql查詢排序mysql
給一組按照時間排序的全部人消費數據,要求依次查出消費滿10元的人(按照消費滿10元的時間排序)。
這題看起來很簡單,彷佛使用sum+排序就能夠解決,可是問題就出在如何按照消費滿10元的時間來排序,這就意味着咱們在查詢中要按照用戶消費的累加值來判斷。
這在程序中很好解決,一次循環遍歷就能夠完成,可是在一條SQL中很差實現。個人思路是這樣的:sql
1.用一個變量來標識用戶的消費累計值,記錄用戶的消費數據,先循環一遍數據,獲得每一個用戶當前消費記錄時的總消費額
2.以上存在一個問題,該數據是針對全部數據使用時間排序的,若是隻用一個變量進行累加計數,獲得的是全部人的值,無法分組記錄
3.把所有數據優先按照用戶來排序,使用用戶+消費時間排序,便可把不一樣用戶的數據劃分開。
4.再加入一個變量,用來記錄遍歷過程當中用戶值的變化,當用戶值發生變化時,消費累計值歸零,進行一次查詢。
5.在以上查詢出的數據上,查出每一個用戶第一條累計值大於等於10的記錄,而後按照消費時間進行排序,便可獲得最終數據數據庫
如下是sql:segmentfault
SELECT d.name, d.id, d.allpay FROM (SELECT id, @allpay := c1.pay + ( CASE WHEN @name = c1.name OR @name = '' THEN @allpay ELSE 0 END ) AS 'allpay', @name, pay, @name := c1.name AS 'name' FROM (SELECT * FROM consumes ORDER BY NAME, id) c1, (SELECT @allpay := 0) a, (SELECT @name := '') b) d WHERE d.allpay >= 10 GROUP BY d.name ORDER BY id
以前刷過LeetCode的數據庫題,其中有一題和這題的解題思路很是類似。code
編寫一個 SQL 查詢,查找全部至少連續出現三次的數字。排序
+----+-----+ | Id | Num | +----+-----+ | 1 | 1 | | 2 | 1 | | 3 | 1 | | 4 | 2 | | 5 | 1 | | 6 | 2 | | 7 | 2 | +----+-----+
例如,給定上面的 Logs 表, 1 是惟一連續出現至少三次的數字。get
+-----------------+ | ConsecutiveNums | +-----------------+ | 1 | +-----------------+
SELECT DISTINCT al.Num AS ConsecutiveNums FROM (SELECT @count := @count + ( CASE WHEN @num = e.Num THEN 0 ELSE 1 END ) AS c, e.Num, @num := e.Num FROM LOGS e, (SELECT @count := 0) a, (SELECT @num := - 1) b) al GROUP BY al.c, al.num HAVING COUNT(*) >= 3