是否可以在 MySQL 中找到 Min/Max 但先删除异常值?
Is it possible in MySQL to find the Min/Max but remove outliers first?
我有一个 table 保存扫描日期时间值。我想从扫描的主要部分找到用户的开始和停止扫描时间。问题是用户可能会在大量扫描之前或之后执行一些检查并生成更多扫描。数据可能如下所示。
....
| 2020-04-01 19:48:05 |
| 2020-04-01 19:48:22 |
| 2020-04-01 19:48:23 |
| 2020-04-01 19:48:48 |
| 2020-04-01 19:48:49 |
| 2020-04-01 20:45:33 |
+---------------------+
如果我按日期分组并获取这些值的 min/max,我经过的时间将比实际时间长很多。在上面的情况下,最大值会增加将近 1 小时的额外时间,而这些时间并没有真正花在扫描上。
SELECT date, MIN(datetime), MAX(datetime) FROM table GROUP BY date
可能有 1 次额外扫描,或者在数据的开头或结尾可能有多次扫描,因此丢弃第一个和最后一个数据点并不是真正的选择。
嗯。 . .我认为这是一个差距和孤岛问题。您需要对何时出现异常值进行一些定义。假设是5分钟:
select min(datetime), max(datetime), count(*) as num_scans
from (select t.*,
sum(case when prev_datetime > datetime - interval 5 minute then 0 else 1 end) over (order by datetime) as grp
from (select t.*,
lag(datetime) over (order by datetime) as prev_datetime
from t
) t
) t
group by grp;
我不确定您如何区分实际扫描和离群值。也许如果有不止一排左右。如果是这种情况,您可以使用 having count(*) > 1
.
等逻辑删除异常值
我有一个 table 保存扫描日期时间值。我想从扫描的主要部分找到用户的开始和停止扫描时间。问题是用户可能会在大量扫描之前或之后执行一些检查并生成更多扫描。数据可能如下所示。
....
| 2020-04-01 19:48:05 |
| 2020-04-01 19:48:22 |
| 2020-04-01 19:48:23 |
| 2020-04-01 19:48:48 |
| 2020-04-01 19:48:49 |
| 2020-04-01 20:45:33 |
+---------------------+
如果我按日期分组并获取这些值的 min/max,我经过的时间将比实际时间长很多。在上面的情况下,最大值会增加将近 1 小时的额外时间,而这些时间并没有真正花在扫描上。
SELECT date, MIN(datetime), MAX(datetime) FROM table GROUP BY date
可能有 1 次额外扫描,或者在数据的开头或结尾可能有多次扫描,因此丢弃第一个和最后一个数据点并不是真正的选择。
嗯。 . .我认为这是一个差距和孤岛问题。您需要对何时出现异常值进行一些定义。假设是5分钟:
select min(datetime), max(datetime), count(*) as num_scans
from (select t.*,
sum(case when prev_datetime > datetime - interval 5 minute then 0 else 1 end) over (order by datetime) as grp
from (select t.*,
lag(datetime) over (order by datetime) as prev_datetime
from t
) t
) t
group by grp;
我不确定您如何区分实际扫描和离群值。也许如果有不止一排左右。如果是这种情况,您可以使用 having count(*) > 1
.