计算带有日期的唯一字符串的数量,可能有错误
Calculate the number of unique strings with the date, with a possible error
在 select 中,我从 table 中获取时间格式为 TIMESTAMP 的行。我想计算唯一行数,但可能有 1 秒的错误。例如下面的例子,3条唯一记录(1和2有1秒的误差,因此算作一条)。
我想做一个像 ABS(time_1 - time_2) > 1 这样的函数来搜索唯一值。
- 是否可以在 SQL 端以某种方式实现它,或者在服务器端实现它会更好,因为服务器端会提取这些数据?
- 没有函数也能做到吗?
- 这会给数据库带来多大的负担?
欢迎任何解决问题的tips!
ps: 我有一个旧版本 SQL 5.7
示例输出:
+------------+
| time |
+------------+
| 1583060400 |
+------------+
| 1583060401 |
+------------+
| 1583060460 |
+------------+
| 1583074860 |
+------------+
假设“如果一行 TIMESTAMP 与前一行 TIMESTAMP 的差异不超过 1 秒,则忽略该行存在”,您可以使用
SELECT MAX(counter) groups_amount
FROM ( SELECT CASE WHEN TIMESTAMPDIFF(SECOND, @previous, `time`) > 1
THEN @counter := @counter + 1
END counter,
@previous := `time`
FROM test
CROSS JOIN ( SELECT @previous := '1970-01-01 00:00:01',
@counter := 0 ) init_vars
ORDER BY `time` ASC ) subquery;
https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=2aba3b8f473e65f4f40e449c8d97a79d
在 select 中,我从 table 中获取时间格式为 TIMESTAMP 的行。我想计算唯一行数,但可能有 1 秒的错误。例如下面的例子,3条唯一记录(1和2有1秒的误差,因此算作一条)。
我想做一个像 ABS(time_1 - time_2) > 1 这样的函数来搜索唯一值。
- 是否可以在 SQL 端以某种方式实现它,或者在服务器端实现它会更好,因为服务器端会提取这些数据?
- 没有函数也能做到吗?
- 这会给数据库带来多大的负担?
欢迎任何解决问题的tips!
ps: 我有一个旧版本 SQL 5.7
示例输出:
+------------+
| time |
+------------+
| 1583060400 |
+------------+
| 1583060401 |
+------------+
| 1583060460 |
+------------+
| 1583074860 |
+------------+
假设“如果一行 TIMESTAMP 与前一行 TIMESTAMP 的差异不超过 1 秒,则忽略该行存在”,您可以使用
SELECT MAX(counter) groups_amount
FROM ( SELECT CASE WHEN TIMESTAMPDIFF(SECOND, @previous, `time`) > 1
THEN @counter := @counter + 1
END counter,
@previous := `time`
FROM test
CROSS JOIN ( SELECT @previous := '1970-01-01 00:00:01',
@counter := 0 ) init_vars
ORDER BY `time` ASC ) subquery;
https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=2aba3b8f473e65f4f40e449c8d97a79d