使用LAG / LEAD查找数据峰会产生十年变化(即9,99,999)以及正确的峰

时间:2019-05-30 20:24:58

标签: sql sql-server

dbase中的数据每分钟收集一次。 Weld_Minutes将递增,直到在班次或产品更改结束时重置为止。该代码找到峰值Weld_Minutes。不幸的是,它看到从9分钟到10分钟的转换高峰,以及从99分钟到100分钟的转换高峰。我不知道为什么。我也是菜鸟。

        select
                case when pt = 1 then DateInserted end as Day_and_Time,
        case when pt = 1 then Weld_Time end as Weld_Minutes,
        case when pt = 1 then Ft_Ran end as Feet_Ran
from (
      select *, case
                 when DateInserted BETWEEN '2019-05-19 06:00:00' AND '2019-05-21 06:10:00'
              and lag(Weld_Time) over(order by DateInserted) <= Weld_Time 
                  and lead(Weld_Time) over(order by DateInserted) < Weld_Time then 1 -- peak
            end as pt
      from mill_30
     ) sq
where pt is not null;

查询结果:

+-------------------------+--------------+----------+
|      Day_and_Time       | Weld_Minutes | Feet_Ran |
+-------------------------+--------------+----------+
| 2019-05-20 09:40:54.157 |            9 |      208 |
| 2019-05-20 16:51:00.130 |           34 |      595 |
| 2019-05-20 17:48:01.207 |            9 |      148 |
| 2019-05-20 20:48:01.567 |           99 |     1628 |
| 2019-05-21 01:06:04.083 |          308 |     5933 |
| 2019-05-21 01:15:04.263 |            9 |      185 |
| 2019-05-21 01:41:04.217 |           34 |      721 |
+-------------------------+--------------+----------+
The Weld_Minutes 9, 9, 99, and 9 are not peaks.  34, 308, and 34 are the correct peaks.

1 个答案:

答案 0 :(得分:0)

您的问题有点难以理解。您的样本数据中没有weld_time列。问题中没有weld_minutes。这些可能是相关的。

如果您要比较的列是 string ,而不是数字,则会看到此问题。我建议您将其转换为数字(整数,数字,浮点数)以进行比较。

由于数据和问题不同步,我在描述解决方案而不是写代码。