Mysql:比较和过滤时间条目

时间:2017-05-15 10:35:24

标签: mysql filter compare

我有一个包含用户ID和登录日期的表。

id | customer | timestamp  
1  | 1        | 2017-02-10 11:30:28  
2  | 1        | 2017-02-11 11:30:28  
3  | 2        | 2017-02-12 11:30:28  
4  | 3        | 2017-02-13 11:30:28  
5  | 1        | 2017-02-14 11:30:28 

现在我想得到每位客户最长连续登录数。

我明白了,一个客户正确计算了差异。

SELECT  a.id aId,
    b.id bId,
    a.customer,
    a.timestamp aTime,
    b.timestamp bTime,
    DATEDIFF(b.timestamp, a.timestamp) as diff
FROM logins a
INNER JOIN logins b
    ON a.customer = b.customer AND a.id < b.id
WHERE b.customer = 7
GROUP BY a.id

如何对整个表格执行此操作并计算以下登录时间差异不足1天?

此示例的所需结果应为:

customer | days of continuous login  
1        | 2  
2        | 1  
3        | 1

1 个答案:

答案 0 :(得分:2)

您可以使用LEFT JOIN

执行此操作

<强>查询

SELECT 
   logins.customer
 , COUNT(*) as "longest continuous streak of logins"
FROM ( 

SELECT 
  login1.*
FROM 
 login login1 
LEFT JOIN 
 login login2
ON
 login1.timestamp < login2.timestamp
AND
 # Only JOIN if date diff is less or equal then 1 day
 DATEDIFF(login2.timestamp, login1.timestamp) <= 1 
WHERE
   login2.id IS NOT NULL
 AND
   login2.customer IS NOT NULL
 AND
   login2.timestamp IS NOT NULL
ORDER BY 
 login1.customer

) 
 AS logins
GROUP BY
 logins.customer

<强>结果

| customer | longest continuous streak of logins |
|----------|-------------------------------------|
|        1 |                                   2 |
|        2 |                                   1 |
|        3 |                                   1 |

参见演示http://www.sqlfiddle.com/#!9/ad581/17