按日期范围分组

Posted

技术标签:

【中文标题】按日期范围分组【英文标题】:Group by on range of dates 【发布时间】:2021-02-04 08:54:51 【问题描述】:

我已经阅读了一些关于按顺序分组的主题,但我无法找到解决问题的方法。

我有一张这样的桌子(名字是ViewHistory)。

Tme                         Value
2020-07-22 09:30:00         1
2020-07-22 09:31:00         2
2020-07-22 09:32:00         3
2020-07-22 09:33:00         4
2020-07-22 09:34:00         5
2020-07-22 09:35:00         6
.
.
.

数据可以无限增长。

在这张表中,有很多1 minTimeFrame的记录。

我想使用 timeFrame 2 minSum(value) 对 dataTime 范围进行分组。 像这样的输出:

TimeFrame   SumData
09:30       1
09:32       5 -- sum of range 09:31_09:32
09:34       9 -- sum of range 09:33_09:34
.
.
.

我怎样才能自动执行此操作,而不是使用:

WHERE Tme BETWEEN ('2020-07-22 09:31:00' AND '2020-07-22 09:32:00')

【问题讨论】:

【参考方案1】:

我确信有一个更简单的方法,但它现在不适合我。

declare @Test table (tme datetime2, [value] int)

insert into @Test (tme, [value])
values
('2020-07-22 09:30:00',         1),
('2020-07-22 09:31:00',         2),
('2020-07-22 09:32:00',         3),
('2020-07-22 09:33:00',         4),
('2020-07-22 09:34:00',         5),
('2020-07-22 09:35:00',         6);

with cte as (
  select convert(date, tme) [date], datepart(hour, tme) [hour], datepart(minute,dateadd(minute, 1,tme)) / 2 [minute], sum([value]) [value]
  from @Test
  group by convert(date, tme), datepart(hour, tme), datepart(minute,dateadd(minute, 1,tme)) / 2
)
select convert(varchar(2),[hour]) + ':' + convert(varchar(2), [minute] * 2) [time], [value]
  -- , dateadd(minute, [minute] * 2, dateadd(hour, [hour], convert(datetime2, [date]))) -- Entire date if desired
from cte;

这给出了:

time value
9:30 1
9:32 5
9:34 9
9:36 6

【讨论】:

thx @Dale K,这似乎很接近答案,请用我的输出检查你的结果。 CROSS APPLY 计算所以你不必写两次。 @Charlieface 可以做到——在这种情况下感觉就像是在给布丁做蛋蛋。

以上是关于按日期范围分组的主要内容,如果未能解决你的问题,请参考以下文章

按名称分组的连续日期范围内的最小和最大日期

按日期范围分组 mongodb

Oracle - 按类别分组,日期范围[重复]

在mysql和php中按日期范围分组

C# - LINQ - 按日期范围分组集合

SQL选择数据并按日期范围分组数据