我需要查找并标记数据条目,从 mysql 一小时内的第三个开始算起
I need to find and mark data entries, counting from the third within an hour on mysql
我有一个记录用户交互的数据库。预计每位用户每小时 2 次(00-59 分钟),任何超过的都应标记为额外。以下 table 表示我试图通过更新 'extra' 列来实现的结果。知道我会怎么做吗?
id
user
timestamp
extra
1
1
2021-05-18 15:46:18
0
2
2
2021-05-18 15:41:18
1
3
2
2021-05-18 15:38:18
1
4
2
2021-05-18 15:19:18
0
5
2
2021-05-18 15:12:18
0
6
1
2021-05-18 14:46:18
0
7
2
2021-05-18 14:46:18
0
8
2
2021-05-18 14:13:18
0
9
1
2021-05-18 12:58:18
1
10
2
2021-05-18 12:46:18
0
11
1
2021-05-18 12:13:18
0
12
1
2021-05-18 12:01:18
0
您可以将 RowNUMBER 用于按用户分区和每小时时间戳
CREATE TABLE table1 (
`id` INTEGER,
`user` INTEGER,
`timestamp` DATETIME,
`extra` INTEGER
);
INSERT INTO table1
(`id`, `user`, `timestamp`, `extra`)
VALUES
('1', '1', '2021-05-18 15:46:18', '0'),
('2', '2', '2021-05-18 15:41:18', '0'),
('3', '2', '2021-05-18 15:38:18', '1'),
('4', '2', '2021-05-18 15:19:18', '0'),
('5', '2', '2021-05-18 15:12:18', '0'),
('6', '1', '2021-05-18 14:46:18', '0'),
('7', '2', '2021-05-18 14:46:18', '0'),
('8', '2', '2021-05-18 14:13:18', '0'),
('9', '1', '2021-05-18 12:58:18', '0'),
('10', '2', '2021-05-18 12:46:18', '0'),
('11', '1', '2021-05-18 12:13:18', '0'),
('12', '1', '2021-05-18 12:01:18', '0');
UPDATE table1 t1
JOIN (SELECT
`id`,
IF(ROW_NUMBER() OVER( PARTITION BY `user`,DATE_FORMAT(`timestamp`,'%Y-%m-%d %h') ORDER BY `user`,`timestamp`) < 3,0,1) extra
FROM table1) t2 ON t1.id = t2.id
SET t1.`extra` = t2.`extra`
SELECT * FROM table1
id | user | timestamp | extra
-: | ---: | :------------------ | ----:
1 | 1 | 2021-05-18 15:46:18 | 0
2 | 2 | 2021-05-18 15:41:18 | 1
3 | 2 | 2021-05-18 15:38:18 | 1
4 | 2 | 2021-05-18 15:19:18 | 0
5 | 2 | 2021-05-18 15:12:18 | 0
6 | 1 | 2021-05-18 14:46:18 | 0
7 | 2 | 2021-05-18 14:46:18 | 0
8 | 2 | 2021-05-18 14:13:18 | 0
9 | 1 | 2021-05-18 12:58:18 | 1
10 | 2 | 2021-05-18 12:46:18 | 0
11 | 1 | 2021-05-18 12:13:18 | 0
12 | 1 | 2021-05-18 12:01:18 | 0
db<>fiddle here
我有一个记录用户交互的数据库。预计每位用户每小时 2 次(00-59 分钟),任何超过的都应标记为额外。以下 table 表示我试图通过更新 'extra' 列来实现的结果。知道我会怎么做吗?
id | user | timestamp | extra |
---|---|---|---|
1 | 1 | 2021-05-18 15:46:18 | 0 |
2 | 2 | 2021-05-18 15:41:18 | 1 |
3 | 2 | 2021-05-18 15:38:18 | 1 |
4 | 2 | 2021-05-18 15:19:18 | 0 |
5 | 2 | 2021-05-18 15:12:18 | 0 |
6 | 1 | 2021-05-18 14:46:18 | 0 |
7 | 2 | 2021-05-18 14:46:18 | 0 |
8 | 2 | 2021-05-18 14:13:18 | 0 |
9 | 1 | 2021-05-18 12:58:18 | 1 |
10 | 2 | 2021-05-18 12:46:18 | 0 |
11 | 1 | 2021-05-18 12:13:18 | 0 |
12 | 1 | 2021-05-18 12:01:18 | 0 |
您可以将 RowNUMBER 用于按用户分区和每小时时间戳
CREATE TABLE table1 ( `id` INTEGER, `user` INTEGER, `timestamp` DATETIME, `extra` INTEGER ); INSERT INTO table1 (`id`, `user`, `timestamp`, `extra`) VALUES ('1', '1', '2021-05-18 15:46:18', '0'), ('2', '2', '2021-05-18 15:41:18', '0'), ('3', '2', '2021-05-18 15:38:18', '1'), ('4', '2', '2021-05-18 15:19:18', '0'), ('5', '2', '2021-05-18 15:12:18', '0'), ('6', '1', '2021-05-18 14:46:18', '0'), ('7', '2', '2021-05-18 14:46:18', '0'), ('8', '2', '2021-05-18 14:13:18', '0'), ('9', '1', '2021-05-18 12:58:18', '0'), ('10', '2', '2021-05-18 12:46:18', '0'), ('11', '1', '2021-05-18 12:13:18', '0'), ('12', '1', '2021-05-18 12:01:18', '0');
UPDATE table1 t1 JOIN (SELECT `id`, IF(ROW_NUMBER() OVER( PARTITION BY `user`,DATE_FORMAT(`timestamp`,'%Y-%m-%d %h') ORDER BY `user`,`timestamp`) < 3,0,1) extra FROM table1) t2 ON t1.id = t2.id SET t1.`extra` = t2.`extra`
SELECT * FROM table1
id | user | timestamp | extra -: | ---: | :------------------ | ----: 1 | 1 | 2021-05-18 15:46:18 | 0 2 | 2 | 2021-05-18 15:41:18 | 1 3 | 2 | 2021-05-18 15:38:18 | 1 4 | 2 | 2021-05-18 15:19:18 | 0 5 | 2 | 2021-05-18 15:12:18 | 0 6 | 1 | 2021-05-18 14:46:18 | 0 7 | 2 | 2021-05-18 14:46:18 | 0 8 | 2 | 2021-05-18 14:13:18 | 0 9 | 1 | 2021-05-18 12:58:18 | 1 10 | 2 | 2021-05-18 12:46:18 | 0 11 | 1 | 2021-05-18 12:13:18 | 0 12 | 1 | 2021-05-18 12:01:18 | 0
db<>fiddle here