首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >POSTGRESQL group by for interval

POSTGRESQL group by for interval
EN

Stack Overflow用户
提问于 2021-01-05 18:34:19
回答 1查看 56关注 0票数 2

我有一个查询,其中我有一个单位的电灯开关打开的时间,开关(开始)时间和开关(结束)时间。

我想知道有多少个电灯开关开着,有人知道我该怎么做吗?

查询示例:

代码语言:javascript
复制
Select Flat, ID_light, start, end, 1 as ON
from lights

I/O示例:

输入数据:

代码语言:javascript
复制
Flat    Id Light    Start   End On
1   1   01/01/2021 00:00:15 01/01/2021 00:59:00 1
1   2   01/01/2021 00:00:15 01/01/2021 01:59:00 1
2   1   01/01/2021 00:00:15 01/01/2021 00:01:15 1
2   1   01/01/2021 00:02:00 01/01/2021 01:00:00 1
2   2   01/01/2021 00:00:00 01/01/2021 08:00:00 1

文本输出:

代码语言:javascript
复制
Flat    Start   End Lights On
1   01/01/2021 00:00:15 01/01/2021 00:59:00 2
1   01/01/2021 00:59:00 01/01/2021 01:59:00 1
2   01/01/2021 00:00:00 01/01/2021 00:00:15 1
2   01/01/2021 00:00:15 01/01/2021 00:01:15 2
2   01/01/2021 00:01:15 01/01/2021 00:02:00 1
2   01/01/2021 00:02:00 01/01/2021 01:00:00 2
2   01/01/2021 01:00:00 01/01/2021 08:00:00 1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-06 02:19:18

range数据类型简化了这一过程。

获取所有单位和时间:

代码语言:javascript
复制
with times as (
  select flat, start as ts from lights
  union
  select flat, end_ from lights
),

使用lead()为每个间隔构造行

代码语言:javascript
复制
 all_ivals as (
  select flat, ts as start, 
         lead(ts) over (partition by flat 
                            order by ts) as end_
    from times
)

使用范围重叠&&运算符连接回原始表并进行聚合:

代码语言:javascript
复制
select a.flat, a.start, a.end_, count(*) as lights_on
  from all_ivals a
       join lights l
         on tsrange(l.start, l.end_, '[)') && tsrange(a.start, a.end_, '[)')
        and l.flat = a.flat
 where a.end_ is not null
 group by a.flat, a.start, a.end_
 order by a.flat, a.start
 ;

结果:

代码语言:javascript
复制
flat start               end_                lights_on
1    2021-01-01 00:00:15 2021-01-01 00:59:00         2
1    2021-01-01 00:59:00 2021-01-01 01:59:00         1
2    2021-01-01 00:00:00 2021-01-01 00:00:15         1
2    2021-01-01 00:00:15 2021-01-01 00:01:15         2
2    2021-01-01 00:01:15 2021-01-01 00:02:00         1
2    2021-01-01 00:02:00 2021-01-01 01:00:00         2
2    2021-01-01 01:00:00 2021-01-01 08:00:00         1
7 rows

Working fiddle

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65577212

复制
相关文章

相似问题

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