感谢您查看我的问题。 我需要帮助编写一个基于日期按内容分组的查询,但是一些内容可能来自之前的日期,因为日期是通过截止时间确定的。
以下是我的问题的一个例子
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点
有人可以帮忙写这个查询吗?
答案 0 :(得分:0)
如果您缩短了时间,例如在22:00,您实际上可以通过一个小的“黑客”轻松解决这个问题 - 您可以先添加2小时的日期,然后按这个新值分组:
DATEADD(hour, 2, temistamp)
这将使22:00之后的所有值“溢出”到第二天,您可以使用cast
剪切时间和分组。
只是一个小建议:列名中有一个拼写错误 - 它应该是timestamp
: - )