基于日期的最后连续插入记录的计数

时间:2018-08-28 13:57:33

标签: mysql sql gaps-and-islands

我想获取最近连续插入记录的数量。

我的表为

user_id | point |   DateTime
1       |   10  |   18-08-2018 17:15
2       |   10  |   01-08-2018 17:15
1       |   10  |   21-08-2018 17:15
1       |   10  |   22-08-2018 17:15
2       |   10  |   26-08-2018 17:15
1       |   10  |   25-08-2018 17:15
2       |   10  |   27-08-2018 17:15
1       |   10  |   26-08-2018 17:15
1       |   10  |   27-08-2018 17:15

现在有6条关于user_id = 1的记录

但是我想计算上一个日期的最后连续记录

因此,预期输出应为

  

3

因为

27-08-2018
26-08-2018
25-08-2018

以上日期是连续的,然后25-08-201822-08-2018之间有一个间隔

如果存在24-08-2018的另一条记录,则输出应为

  

4

这是我的SQLFiddle

2 个答案:

答案 0 :(得分:1)

请考虑以下内容:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,dt DATE NOT NULL
);

INSERT INTO my_table (dt) VALUES
('2018-08-18'),
('2018-08-01'),
('2018-08-21'),
('2018-08-22'),
('2018-08-26'),
('2018-08-25'),
('2018-08-27'),
('2018-08-26'),
('2018-08-27');

SELECT i 
  FROM
     (
       SELECT x.*
            , CASE WHEN @prev = dt 
                   THEN @i:=@i 
                   WHEN @prev = dt-INTERVAL 1 DAY 
                   THEN @i:=@i+1 
                   ELSE @i:=1 END i
            , @prev := dt prev
         FROM my_table x
            , (SELECT @prev:=null,@i:=0) vars
        ORDER 
           BY dt 
            , id
     ) a
 ORDER 
    BY dt DESC
     , id DESC
 LIMIT 1;

+------+
| i    |
+------+
|    3 |
+------+

答案 1 :(得分:1)

首先,您需要让DateTime列为datetime类型

这是一个空白和岛屿问题,您可以尝试通过user_id来创建行号,并从每个min(datetime)中来计算每个user_id的天数。

CREATE TABLE Table1
    (`user_id` varchar(12), `point` varchar(9), `DateTime` datetime)
;

INSERT INTO Table1
    (`user_id`, `point`, `DateTime`)
VALUES
    ('1', '10', '2018-08-18 17:15'),
    ('2', '10', '2018-08-01 17:15'),
    ('1', '10', '2018-08-21 17:15'),
    ('1', '10', '2018-08-22 17:15'),
    ('2', '10', '2018-08-26 17:15'),
    ('1', '10', '2018-08-25 17:15'),
    ('2', '10', '2018-08-27 17:15'),
    ('1', '10', '2018-08-26 17:15'),
    ('1', '10', '2018-08-27 17:15')

;

查询1

SELECT cnt
FROM (
  SELECT rn,MAX(DateTime) mxDt,COUNT(*) cnt
    FROM (
      SELECT DateTime,datediff(DateTime,mDt) -(SELECT COUNT(*) 
                FROM Table1 tt 
                WHERE t2.DateTime >= tt.DateTime 
                and t2.user_id = tt.user_id
               ) rn
      FROM (
        SELECT user_id,MIN(DateTime) mDt
        FROM Table1
        GROUP BY user_id
      ) t1 INNER JOIN Table1 t2 on t1.user_id = t2.user_id
      Where t1.user_id = 1 ##set your expect select user_id
    ) t1
  GROUP BY rn
)t1 
ORDER BY mxDt desc
LIMIT 1

Results

| cnt |
|-----|
|   3 |