原题是一位同窗的提问 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