【问题标题】:Group by clause which spans over multiple days based upon timestamp基于时间戳跨越多天的 Group by 子句
【发布时间】:2018-01-22 20:27:19
【问题描述】:

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

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

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 点 有人可以帮助编写此查询吗?

【问题讨论】:

  • 什么是截止时间?
  • 对不起,我确实是在下一个小时写的,但我想不清楚 insert into #tdata select 'Machine1','2018-01-01 22:45:20.000', 1,3.95;--从这里到上面应该在下一个日期截止时间是22小时或晚上10点

标签: sql .net sql-server


【解决方案1】:

例如,如果您在 22:00 缩短时间,您实际上可以通过一个小“hack”很容易地解决这个问题 - 您可以先将日期添加 2 小时,然后按此新值分组:

DATEADD(hour, 2, temistamp)

这将使22:00之后的所有值“溢出”到第二天,您可以使用cast来缩短时间并以此分组。

还有一个小建议:列名中有错字 - 应该是 timestamp :-)

【讨论】:

  • 我想知道当没有跨越两个日期的数据时这是否会起作用,这意味着截止日期之后没有数据?我已经编辑了我的问题以反映这种情况
  • 是的,它仍然会按预期工作,因为应该属于给定日期的所有数据在加上 2 小时的差异后仍然会落入其中。
  • 谢谢,我花了一段时间才弄清楚我究竟需要做什么才能回答我的问题,但是,正是你的 hack 引导我朝着最终导致正确的方向前进回答。
猜你喜欢
  • 2023-02-22
  • 2012-02-18
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多