微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

选择从第一个坏值到最后一个坏值范围内的数据

如何解决选择从第一个坏值到最后一个坏值范围内的数据

有这样的表和数据:

create table sensor_values(
    dt DateTime default Now(),value UInt32
)
engine MergeTree()
partition by toYYYYMM(dt)
order by tuple();

insert into sensor_values(value) values (1),(2),(11),(13),(4),(17),(5),(8);

数据:

value
-----
1
2
11
13
4
17
5
8

我想选择从第一个错误值 (11) 到最后一个错误值 (17) 范围内的数据。错误值超过 10。

选择后的期望范围:

value
-----
11
13
4
17

我的第一个想法是定义价值是否为坏,然后计算(以某种方式)累积和:

value  isBad  cumSum
--------------------
1      0      0
2      0      0
11     1      1
13     1      2
4      0      2
17     1      3
5      0      3
8      0      3

然后我会从 min(cumSum) 到 max(cumSum) - 1 中进行选择,但我错过了最后一个错误值。

如何获取选择结果中包含的最后一个值?

解决方法

您可以尝试使用窗口函数(参见:runningDifferenceneighbor)或数组函数:

SELECT arrayJoin(slice) as result
FROM (
    SELECT
        groupArray(data) AS arr,arrayFirstIndex(x -> (x > 10),arr) AS first_index,(length(arr) - arrayFirstIndex(x -> (x > 10),arrayReverse(arr)) + 1) AS last_index,arraySlice(arr,first_index,last_index - first_index + 1) AS slice    
    FROM 
    (
        /* test dataset */
        SELECT arrayJoin([1,2,11,13,4,17,5,8]) AS data
    )
)
/*
┌─result─┐
│     11 │
│     13 │
│      4 │
│     17 │
└────────┘
*/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。