Sql分组36小时

时间:2015-05-27 23:55:30

标签: sql sql-server tsql

如何编写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

2 个答案:

答案 0 :(得分:2)

--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

答案 1 :(得分:1)

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

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

Form

您可以通过使用递归CTE或其他类似的东西来避免创建日期表,但我不会真的推荐它。