首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从值x开始的行和组,直到遇到y值,然后重复

从值x开始的行和组,直到遇到y值,然后重复
EN

Stack Overflow用户
提问于 2019-05-03 19:30:08
回答 2查看 33关注 0票数 1

我试图将行分组,从值大于0开始,然后一直到值返回到0,然后在表中重复。

这是MySQL 8.0..。我不知道从何说起这个。

示例表

代码语言:javascript
复制
| tag          | value | timestamp                |
|--------------|-------|--------------------------|
| sts_downtime | 0     | 2019-01-03 09:31:40.8240 |
| sts_downtime | 1     | 2019-01-03 09:50:23.0310 |
| sts_downtime | 3     | 2019-01-03 09:53:07.7750 |
| sts_downtime | 4     | 2019-01-03 09:53:40.6060 |
| sts_downtime | 0     | 2019-01-04 08:48:27.1020 |
| sts_downtime | 0     | 2019-01-04 13:30:26.5180 |
| sts_downtime | 10    | 2019-01-04 14:19:56.3740 |
| sts_downtime | 10    | 2019-01-07 08:49:03.8480 |
| sts_downtime | 10    | 2019-01-07 09:34:25.0850 |
| sts_downtime | 0     | 2019-01-07 09:34:53.9940 |
| sts_downtime | 0     | 2019-01-07 12:59:21.3210 |

我想要什么

代码语言:javascript
复制
| Sum of Value | Start                    | End                      |
|--------------|--------------------------|--------------------------|
| 8            | 2019-01-03 09:50:23.0310 | 2019-01-03 09:53:40.6060 |
| 30           | 2019-01-04 14:19:56.3740 | 2019-01-07 09:34:25.0850 |
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-03 21:07:38

您可以访问MySQL 8中的窗口函数,请使用它们。

代码语言:javascript
复制
WITH cte1 AS (
    SELECT *, CASE
        WHEN LAG(value, 1, 0) OVER (ORDER BY timestamp) = 0 AND value > 0 THEN 1
        WHEN LAG(value, 1, 0) OVER (ORDER BY timestamp) > 0 AND value = 0 THEN 1 END AS chg
    FROM t
), cte2 AS (
    SELECT *, SUM(chg) OVER (ORDER BY timestamp) AS grp
    FROM cte1
)
SELECT SUM(value) AS `Sum of value`, MIN(timestamp) AS `Start`, MAX(timestamp) AS `End`
FROM cte2
GROUP BY grp
HAVING SUM(value) > 0

Demo on db<>fiddle

票数 0
EN

Stack Overflow用户

发布于 2019-05-03 20:13:36

有几个CTE:

代码语言:javascript
复制
with 
ctemin as (
  select t.timestamp from tablename t
    where value <> 0 and 
    (select value from tablename where timestamp = 
       (select max(timestamp) from tablename where timestamp < t.timestamp)
    ) = 0
),  
ctemax as (
  select t.timestamp from tablename t
    where value <> 0 and 
    (select value from tablename where timestamp = 
       (select min(timestamp) from tablename where timestamp > t.timestamp)
    ) = 0
),
cte as (
  select 
    t.timestamp Start,
    (select min(timestamp) from ctemax 
     where timestamp >= t.timestamp) End
  from ctemin t
)  

select 
  sum(value) `Sum of Value`,
  c.Start, c.End
from cte c inner join tablename t
on t.timestamp between c.Start and c.End
group by c.Start, c.End

演示

结果:

代码语言:javascript
复制
| Sum of Value | Start                      | End                        |
| ------------ | -------------------------- | -------------------------- |
| 8            | 2019-01-03 09:50:23.031000 | 2019-01-03 09:53:40.606000 |
| 30           | 2019-01-04 14:19:56.374000 | 2019-01-07 09:34:25.085000 |
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55976059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档