我有一个包含以下列的数据库
userId | win | startTime
1 1 1483113030149
2 1 1483110804384
1 0 1483109032694
1 1 1483105707639
2 0 1483096891200
1 1 1483017584986
1 0 1483000326940
现在我想知道连续获胜的最大值是什么(对于球员1来说是2)。
如何编写SQL查询?这是可能的还是有其他选择?
换言之,在下面的查询中,必须放置什么来代替“一行中的最大数量”?
SELECT
maximum amount of wins IN a ROW
FROM
TABLE
WHERE
userId = 1
AND startTime > 1483000000000
ORDER BY
startTime DESC
最佳答案
我提议一个三步查询:
为了每一场胜利,找出最接近的失败
以同样最接近的失败来计算胜负
选择最大计数
当starttime对于每个用户id都是唯一的时,查询工作得最好。
SELECT seqs.userid,
Max(wins) AS `longest series`
FROM (SELECT iq.userid,
Min(iq.starttime) starttime,
iq.endtime,
Count(*) wins
FROM (SELECT tf.userid,
tf.win,
tf.starttime,
(SELECT Min(tl.starttime)
FROM t tl
WHERE tl.userid = tf.userid
AND tl.win = 0
AND tl.starttime > tf.starttime) endtime
FROM t tf
WHERE tf.win = 1) iq
GROUP BY iq.userid,
iq.endtime) seqs
GROUP BY seqs.userid
sqlfiddle
正如@gwc所指出的:这个查询不会返回从未赢过的用户。您可以用
Count(*)
替换Sum(iq.win)
并删除WHERE tf.win = 1
以包含它们。看这个sqlfiddle关于mysql - SQL:一行中有特定值的行数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41399165/