Sql按36小时分组[关闭]

Posted

技术标签:

【中文标题】Sql按36小时分组[关闭]【英文标题】:Sql to group by 36 hours [closed] 【发布时间】:2015-05-27 23:55:30 【问题描述】:

如何编写 sql 以返回按 36 小时时间段分组的结果。结果返回 36 小时期间的开始日期,即午夜。

表格中的示例数据

> date                      count
>--------------------------------   
>2015-05-14 01:00:00         1 
>2015-05-15 02:00:00         2    
>2015-05-15 20:00:00         3 
>2015-05-16 03:00:00         4

想要返回的结果

> date            count
>---------------------- 
>2015-05-14         3 
>2015-05-15         9    
>2015-05-16         4

【问题讨论】:

您的结果与示例数据不匹配。另外,让我们看看你的尝试...... 【参考方案1】:
--Set up table and data
DECLARE @ATable TABLE ([date] DATETIME, [Count] INT)
INSERT @ATable( date, Count )
SELECT '2015-05-14 01:00:00', 1
UNION ALL
SELECT '2015-05-15 02:00:00', 2
UNION ALL
SELECT '2015-05-15 20:00:00', 3
UNION ALL
SELECT '2015-05-16 03:00:00', 4

-- Query
SELECT
  d.[date],
  ( -- This subquery returns the sum of counts for the 36 hours
    SELECT
      SUM(a.[count])
    FROM
      @ATable a
    WHERE
      a.[date] < DATEADD(hour, 36, d.[date])
      AND
      a.[date] >= d.[date]
  ) AS [count]
FROM
  ( -- This subquery returns a list of unique dates
    SELECT
      DATEADD(dd, DATEDIFF(dd, 0, [date]), 0) AS [date]
    FROM
      @ATable
    GROUP BY
      DATEADD(dd, DATEDIFF(dd, 0, [date]), 0)
  ) AS d
ORDER BY
  d.date  

请注意,您的数据和要求的结果不匹配,正如您反复告知的那样。以上产生以下结果:

date                          count
----------------------- -----------
2015-05-14 00:00:00.000           3
2015-05-15 00:00:00.000           9
2015-05-16 00:00:00.000           4

【讨论】:

【参考方案2】:

如果您想要总是从午夜开始的每个 36 小时周期的结果,这很容易通过创建一个日期表来解决 - 一个包含每天一行的表 (例如期间 1.1.2000 - 31.12.2099 或任何你需要的最大范围)

然后你可以做这样的事情(未经测试,希望有效)

select
  d.[date],
  (
    sum(x.[count]) 
    from yourtable x 
    where x.[time] >= d.[date] 
    and x.[time] < dateadd(hour, 36, d.[date])
  ) as [count]
from
  dates d

您可以通过使用递归 CTE 或其他类似方法来避免创建日期表,但我不建议这样做。

【讨论】:

以上是关于Sql按36小时分组[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何创建 SQL 查询来计算按日期分组和连接的项目? [关闭]

如何在Oracle sql中将行转换为按多列分组的列[关闭]

Laravel 按日期分组,如 MySQL 查询 GROUP BY MONTH(fields) [关闭]

SQL加入多个子查询 - 按日期计算打开/关闭

Apache Kafka分组两次

sql 显示过去8天的重做次数,按1小时的时间段分组