【问题标题】:SQL - Comparing difference between values in same columnSQL - 比较同一列中值之间的差异
【发布时间】:2022-01-16 22:50:28
【问题描述】:

我需要一些帮助,了解如何比较同一列 LogNum 中的值以查找“异常”条目。例如,在我下面的 LogTbl 表中,我们可以看到在 ID 编号 4 上,与之前的条目模式相比,LogNum 条目大幅跳跃。

我如何比较这些 LogNum 条目并识别/输出任何比上一个条目增加 5% 以上的条目,使用 LogDate 对条目进行老化?

ID LogDate LogNum
1 2006-05-26 00:00:00.000 112
2 2006-07-19 00:00:00.000 145
3 2006-09-08 00:00:00.000 162
4 2006-11-01 00:00:00.000 1787

谢谢。

【问题讨论】:

  • 你所有的值都大于前一个的 5% 吗?

标签: mysql sql


【解决方案1】:

您的要求有很多种,一种可能的想法是使用平均偏差或标准偏差来识别阈值并过滤超过阈值的行。

with a as (
    select *, avg(lognum) over() threshold
  from t
)
select *
from a
where lognum > threshold

如果您只对相邻行之间的差异感兴趣,您可以使用lead,即查找值增加 > 前一个值的 25% 的行

select Id, LogDate, Lognum
from (
    select *, Lead(lognum) over(order by logdate) nxt
    from t
)t
where nxt > lognum * 1.25

【讨论】:

    【解决方案2】:

    您的“大量”和“不寻常”这两个词没有正式的标准。但是我想您可以尝试选择 LogNum 将在边界内的记录(LogNum >= MEAN(LogNum) - 2 * STDDEV(LogNum)) AND - LogNum <= MEAN(LogNum) + 2 * STDDEV(LogNum))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多