在 MySQL 中是不是可以找到最小值/最大值但首先删除异常值?

Posted

技术标签:

【中文标题】在 MySQL 中是不是可以找到最小值/最大值但首先删除异常值?【英文标题】:Is it possible in MySQL to find the Min/Max but remove outliers first?在 MySQL 中是否可以找到最小值/最大值但首先删除异常值? 【发布时间】:2021-02-26 00:02:35 【问题描述】:

我有一个保存扫描日期时间值的表。我想从扫描的主要部分找到用户的开始和停止扫描时间。问题是用户可能会在大量扫描之前或之后执行一些检查并生成更多扫描。数据可能如下所示。

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

如果我按日期分组并获取这些值的最小值/最大值,我所用的时间将比实际时间长得多。在高于最大值的情况下,将增加近 1 小时的额外时间,而这并没有真正花费在扫描上。

SELECT date, MIN(datetime), MAX(datetime) FROM table GROUP BY date

可能有 1 次额外的扫描,或者在数据的开头或结尾可能有多次扫描,因此丢弃第一个和最后一个数据点并不是一个真正的选择。

【问题讨论】:

【参考方案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等逻辑去除异常值。

【讨论】:

我对间隔的定义更像是 15 分钟(很容易更改),然后我还使用有计数来消除那些到处扫描的。我不知道有一个 LAG 功能,我需要进一步阅读,它看起来非常有用!谢谢!

以上是关于在 MySQL 中是不是可以找到最小值/最大值但首先删除异常值?的主要内容,如果未能解决你的问题,请参考以下文章

如何找到所有数据框的最大值,最小值[不是列值,也不是行] [重复]

通过字符串列的最大值和最小值查找数据行中的值是不是相等

使用分治法是不是会提高在数组中查找最大值和最小值的时间复杂度

mysql AUTO_INCREMENT 能设置区间吗?即有一个自增最小值和最大值,最大值自己指定不是该类型的最大值

解决WebView写入localstorage但首次加载取不到值的问题

MySql怎样获取一列中最大值