基于日期的上次连续插入记录的计数

xiozqbni  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(327)

我想得到最后连续插入的记录数。
我把这张table当作

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条用户id=1的记录
但我要计算上一个日期的最后连续记录
所以预期的输出应该是count

因为

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

以上日期是连续的,然后有一个间隔 25-08-201822-08-2018 如果有其他记录 24-08-2018 那么输出应该是
4
这是我的小提琴

gblwokeq

gblwokeq1#

考虑以下几点:

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 |
+------+
ckx4rj1h

ckx4rj1h2#

首先,你需要让 DateTime be列 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

结果:

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

相关问题