分组条款,基于时间戳跨越多天

时间:2018-01-22 20:27:19

标签: sql .net sql-server

感谢您查看我的问题。 我需要帮助编写一个基于日期按内容分组的查询,但是一些内容可能来自之前的日期,因为日期是通过截止时间确定的。

以下是我的问题的一个例子

if object_id('tempdb..#tdata') is not null drop table #tdata;
go

create table #tdata(
  machine_id varchar(12),
  temestamp datetime,
  commit_count int,
  amount decimal(6,2)
);

insert into #tdata select 'Machine1','2018-01-02 13:03:18.000',1,3.95;
insert into #tdata select 'Machine1','2018-01-02 02:11:19.000',1,3.95;
insert into #tdata select 'Machine1','2018-01-01 23:18:16.000',1,3.95;
*insert into #tdata select 'Machine1','2018-01-01 22:45:20.000',1,3.95;*--from here and above should be in next date
insert into #tdata select 'Machine1','2018-01-01 10:13:06.000',1,3.95;
insert into #tdata select 'Machine1','2018-01-01 01:13:59.000',1,3.95;
insert into #tdata select 'Machine1','2018-01-01 00:26:51.000',1,3.95;
insert into #tdata select 'Machine1','2018-01-01 00:17:01.000',1,3.95;
insert into #tdata select 'Machine1','2018-01-01 00:13:11.000',1,3.95;
insert into #tdata select 'Machine1','2018-01-01 00:06:15.000',1,3.95;
insert into #tdata select 'Machine1','2017-12-31 22:59:59.000',1,3.95;
insert into #tdata select 'Machine1','2017-12-31 21:27:25.000',1,3.95;
insert into #tdata select 'Machine1','2017-12-31 20:32:22.000',1,3.95;

select machine_id, 
      cast(temestamp as date),
      sum(commit_count),
      sum(amount) 
from #tdata 
group by machine_id, cast(temestamp as date);

上面给出了跟进

machine_id  (No column name)    (No column name)    (No column name)
Machine1    2017-12-31                         3    11.85
Machine1    2018-01-01                         8    31.60
Machine1    2018-01-02                         2    7.90

您可以看到2018-01-01的总数包括2018-01-02日期的2 commit_count,因为它们发生在上一个日期但是在截止时间之后。总数应为3,6和4 ...... 编辑:有时会有数据跨越前几天的截止时间,而其他时间则不会有任何类似的数据。关闭时间是2200小时或晚上10点 有人可以帮忙写这个查询吗?

1 个答案:

答案 0 :(得分:0)

如果您缩短了时间,例如在22:00,您实际上可以通过一个小的“黑客”轻松解决这个问题 - 您可以先添加2小时的日期,然后按这个新值分组:

DATEADD(hour, 2, temistamp)

这将使22:00之后的所有值“溢出”到第二天,您可以使用cast剪切时间和分组。

只是一个小建议:列名中有一个拼写错误 - 它应该是timestamp: - )