【问题标题】: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 次额外的扫描,或者在数据的开头或结尾可能有多次扫描,因此丢弃第一个和最后一个数据点并不是一个真正的选择。

【问题讨论】:

    标签: mysql sql max min outliers


    【解决方案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 功能,我需要进一步阅读,它看起来非常有用!谢谢!
    猜你喜欢
    • 2015-09-24
    • 2014-11-05
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    相关资源
    最近更新 更多