Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server聚合15分钟_Sql_Sql Server - Fatal编程技术网

SQL Server聚合15分钟

SQL Server聚合15分钟,sql,sql-server,Sql,Sql Server,此查询按分钟聚合数据 如何在15分钟的时间间隔内聚合相同的数据?在派生表中执行日期/时间操作。然后根据结果分组: SELECT AVG(value) AS total, DATEADD(minute, DATEDIFF(minute, 0, reading_time), 0) AS created FROM ... GROUP BY DATEADD(minute, DATEDIFF(minute, 0, reading_time), 0) 受萨吉回

此查询按分钟聚合数据


如何在15分钟的时间间隔内聚合相同的数据?

在派生表中执行日期/时间操作。然后根据结果分组:

SELECT 
    AVG(value) AS total, 
    DATEADD(minute, DATEDIFF(minute, 0, reading_time), 0) AS created
FROM 
     ...  
GROUP BY
     DATEADD(minute, DATEDIFF(minute, 0, reading_time), 0)

受萨吉回答的启发。谢谢

我肯定会为此创建一个日期表。这样做的好处是,即使没有数据,也会返回每个时间段

测试日期表

select avg(value) as total, reading_date, reading_15_mins
from
(
    SELECT value,
           CAST(reading_time as DATE) as reading_date,
           DATEPART(MINUTE, reading_time) / 15 as reading_15_mins
    FROM tablename 
) dt
GROUP BY reading_date, reading_15_mins
样本数据

IF OBJECT_ID('tempdb..#DateTable') IS NOT NULL DROP TABLE #DateTable
GO
CREATE TABLE #DateTable (QuarterHour datetime)
INSERT INTO #DateTable (QuarterHour)
VALUES
 ('2016-06-27 12:00:00.000')
,('2016-06-27 12:15:00.000')
,('2016-06-27 12:30:00.000')
,('2016-06-27 12:45:00.000')
,('2016-06-27 13:00:00.000')
,('2016-06-27 13:15:00.000')
质疑

结果集

SELECT
dt.QuarterHour
,AVG(sd.Value) Value
FROM #DateTable dt
LEFT JOIN #SampleData sd
ON dt.QuarterHour = dateadd(minute, datediff(minute,0,sd.Reading_Time) / 15 * 15, 0)
GROUP BY dt.QuarterHour
日期表有一些明显的优点,性能时间就是其中之一。如果你感兴趣的话,下面还有更多的阅读


我使用自定义项创建动态日期范围(见下文)

Declare@Date1 DateTime='2016-06-27'
声明@Date2 DateTime='2016-06-28'
声明@Incr int=15
选择日期1
,日期2
,总计=平均值(值)
从你的桌子上

从[dbo].[udf Create Range Date](@Date1,@Date2,'MI',@Incr)中加入(选择DateR1=RetVal,DateR2=DateAdd(MI,@Incr,RetVal),其中RetValgroup按模分组:
按分钟分组%15
?可能重复的
SELECT
dt.QuarterHour
,AVG(sd.Value) Value
FROM #DateTable dt
LEFT JOIN #SampleData sd
ON dt.QuarterHour = dateadd(minute, datediff(minute,0,sd.Reading_Time) / 15 * 15, 0)
GROUP BY dt.QuarterHour
QuarterHour                 Value
2016-06-27 12:00:00.000     8
2016-06-27 12:15:00.000     7
2016-06-27 12:30:00.000     6
2016-06-27 12:45:00.000     27
2016-06-27 13:00:00.000     NULL
2016-06-27 13:15:00.000     7
Declare @Date1 DateTime = '2016-06-27'
Declare @Date2 DateTime = '2016-06-28'
Declare @Incr  int      = 15

Select DateR1
      ,DateR2
      ,Total = avg(value)
 From YourTable A
 Join (Select DateR1=RetVal,DateR2=DateAdd(MI,@Incr,RetVal) from [dbo].[udf-Create-Range-Date](@Date1,@Date2,'MI',@Incr) Where RetVal<@Date2) B
   on Reading_Time between DateR1 and DateR2 and ReadingTime < DateR2
CREATE FUNCTION [dbo].[udf-Create-Range-Date] (@DateFrom datetime,@DateTo datetime,@DatePart varchar(10),@Incr int)

Returns 
@ReturnVal Table (RetVal datetime)

As
Begin
    With DateTable As (
        Select DateFrom = @DateFrom
        Union All
        Select Case @DatePart
               When 'YY' then DateAdd(YY, @Incr, df.dateFrom)
               When 'QQ' then DateAdd(QQ, @Incr, df.dateFrom)
               When 'MM' then DateAdd(MM, @Incr, df.dateFrom)
               When 'WK' then DateAdd(WK, @Incr, df.dateFrom)
               When 'DD' then DateAdd(DD, @Incr, df.dateFrom)
               When 'HH' then DateAdd(HH, @Incr, df.dateFrom)
               When 'MI' then DateAdd(MI, @Incr, df.dateFrom)
               When 'SS' then DateAdd(SS, @Incr, df.dateFrom)
               End
        From DateTable DF
        Where DF.DateFrom < @DateTo
    )
    Insert into @ReturnVal(RetVal) Select DateFrom From DateTable option (maxrecursion 32767)
    Return
End

-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2020-10-01','YY',1) 
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2020-10-01','DD',1) 
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2016-10-31','MI',15) 
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2016-10-02','SS',1)