2016-12-27 111 views
0

给定一个包含日期或日期时间列的简单表格,我想查询在给定可选过滤器的情况下存在行的连续天数的最大连续条数。确定连续天数的最大连续数(0123)

例如说表有以下几列:

ID,日期时间,用户名,类别

我希望能够查询,以最有效的方式,将:

  • 最长的条纹(天)一个给定的用户名,
  • 最长给定类别内的给定的用户名的条纹(以天计),
  • 最长的条纹(天)无论任何用户名或类别,

(我猜的查询将没有太大变化基于这些过滤器,但他们给的想法。)

找到其他类似的问题,但没有似乎回答了这个特殊的需求,但是随时可以将我联系到我可能错过的适当的一个。

非常感谢您提前。

+0

您是否想要记录一个给定用户连续记录天数的最大值(难度)或两次连续登录(简单)之间的最大天数?前者为 – Faibbus

+0

。我确实意识到查询不会很简单...谢谢。 – Jeto

+0

这将被构造为一个LAG查询,用于计算这些行数据与上一行之间的差异。那么如果少于一天,那么应该产生'1'的值。整个事件是在非1行上重置的累计和的子查询。 - 那么这就是MAX聚合的子查询。 – Randy

回答

0

所以最终答案是几乎相同的现有问题:Checking for maximum length of consecutive days which satisfy specific condition

但是我重写了它更加清晰和调整的几件事情:

SELECT streak 
FROM (
    SELECT IF(@prevDate + INTERVAL 1 DAY = current.date, @currentStreak := @currentStreak + 1, @currentStreak := 1) AS streak, @prevDate := current.date 
    FROM (
     SELECT DATE(datetime) AS date 
     FROM mytable 
     GROUP BY date 
     ORDER BY date 
    ) AS current 
    INNER JOIN (SELECT @prevDate := NULL, @currentStreak := 1) AS vars 
) AS _ 
ORDER BY streak DESC LIMIT 1; 

为重复似乎是正确的,最终虽然标记这个问题。

1
SELECT streak 
FROM (
    SELECT tb.*, IF(@prev + INTERVAL 1 DAY = tb.d, @count := @count + 1, @count := 1) AS streak, @prev := tb.d 
    FROM (
     SELECT datetime AS d 
     FROM sometable 
     WHERE username = "PWET" 
     ORDER BY datetime 
    ) AS tb 
    INNER JOIN (SELECT @prev := NULL, @count := 1) AS vars 
) AS tb 
ORDER BY streak DESC LIMIT 1; 

来源:Checking for maximum length of consecutive days which satisfy specific condition

+0

哦,这似乎是第一个“相关”问题的答案,我碰到它,但由于某种原因,我认为我的情况并不完全一样。它似乎工作,但我不能在几个小时之前尝试,但谢谢你! – Jeto

+1

你的情况并不完全一样,但它有很强的相似之处。如果您发现任何错字,请告诉我,我没有机会从这里进行测试。 – Faibbus

+1

实际上,查询的COUNT/GROUP BY是必要的,我又做了一些调整。我会张贴它作为回答自己,并将其标记为重复。非常感谢您的帮助。 – Jeto