我想获取最近连续插入记录的数量。
我的表为
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-2018
至22-08-2018
之间有一个间隔
如果存在24-08-2018
的另一条记录,则输出应为
4
这是我的SQLFiddle
答案 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 |