【问题标题】:How to select time intervals with zero values如何选择零值的时间间隔
【发布时间】:2018-11-13 01:08:35
【问题描述】:

我需要选择没有 (0) 数据的时间间隔。如何在 SQL 中做到这一点?

例子:

Time Data
10:00 0
10:15 0
10:30 1
10:45 0
11:00 12
11:15 0
11:30 0
11:45 0
12:00 7

结果:

10:00 - 10:30
10:45 - 11:00
11:15 - 12:00

【问题讨论】:

  • 你的 DBMS 是什么?
  • 预期结果中列出的所有三个区间都包括0。也许你的意思是别的,例如由1分隔的间隔?
  • 我的 DBMS 是 MS SQL,我需要从第一个 0 准确到第一个数据准确(包括它)的时间间隔

标签: sql datetime join group-by intervals


【解决方案1】:

您需要识别组,然后根据组进行聚合。

一种简单的方法是计算每个值上或之后的非零值的数量。这带来了结束时间:

select min(time), max(time)
from (select t.*,
             sum(case when data > 0 then 1 else 0 end) over (order by time desc) as grp
      from t
     ) t
group by grp
having min(data) = 0
order by min(time);

Here 是一个 SQL Fiddle。

注意:这使用了大多数数据库支持的标准 SQL 窗口/分析函数。

【讨论】:

  • 谢谢!这就是我要找的。​​span>
【解决方案2】:

大多数 DBMS 支持 Windowed Aggregates:

with cte as 
 (
   select time, data,
      -- assign a new group number whenever it's not a zero
      -- = same number for a value and following zeroes
      sum(case when data = 0 then 0 else 1 end) 
          over (order by time desc -- start from the latest row
                rows unbounded preceding) as grp 
   from myTable
 ) 
select
   min(time), max(time)
from cte
group by 
   grp -- aggregate previous zeroes with the non-zero row

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多