GROUP BY和JOIN增量为3小时

时间:2015-08-13 20:17:03

标签: sql-server tsql sql-server-2012

我有2个表 - 一个每3小时有一个记录:

    a.aDT        a.aVal
------------    -----------
8/10/15 00:00   1550
8/10/15 03:00   1600
8/10/15 06:00   1650

我有第二个每分钟都有一个值的表:

b.bDT           b.bVal
--------      ------------
8/10/15 00:00     1
8/10/15 00:01     1
8/10/15 00:02     0

我需要结束一个查询,该查询具有两列中3小时样本(a.aDT,a.aVal)的值/日期时间,以及来自b(b.bVal)的值的总和第三栏。我已经尝试过GROUP BY(DATEPART(HOUR,bDT)%3),但这似乎没有回复我正在寻找的东西。

思想?

3 个答案:

答案 0 :(得分:3)

以下内容将您的秒值四舍五入到最近的三小时间隔。例如,9:00到11:59之间的值将四舍五入为12:00样本,而12:00到14:59之间的值将四舍五入为15:00样本。根据您希望如何处理截止值上正好出现的值,您可能需要稍微调整它们。

例如,如果您希望3:00处的值恰好位于3:00组而不是6:00组,则应在使用下面的逻辑之前从bDt中减去秒。

Select a.aDT, a.aVal, sum(b.bVal)
from TableA a
left join TableB b
on datepart(HH, a.aDT) 
    = (datepart(HH, b.bDt) - datepart(HH, bDt) % 3 + 3) % 24 --Convert the time in table B to be the next highest multiple of three
and cast(a.aDt as date) 
    = cast(b.bDt as date) --Make sure the samples are from the same day
group by a.aDT, a.aVal

答案 1 :(得分:0)

尝试这样的事情:

DECLARE @DATA TABLE (bDT DATETIME, bVal INT)

INSERT INTO @DATA (bDT, bVal)
SELECT '2015-08-10 00:00', 1 UNION
SELECT '2015-08-10 00:01', 1 UNION
SELECT '2015-08-10 00:02', 0 UNION
SELECT '2015-08-10 03:00', 1 UNION
SELECT '2015-08-10 04:00', 1 UNION
SELECT '2015-08-10 06:15', 0 UNION
SELECT '2015-08-10 06:15', 1 

SELECT *, DATEADD(HH,(DATEPART(HH,CONVERT(TIME,bDT))/3)*3, CONVERT(DATETIME,CONVERT(DATE,bDT))) Matching_A_Hour
FROM @DATA

SELECT DATEADD(HH,(DATEPART(HH,CONVERT(TIME,bDT))/3)*3, CONVERT(DATETIME,CONVERT(DATE,bDT))) Matching_A_Hour, SUM(bVal)
FROM @DATA
GROUP BY DATEADD(HH,(DATEPART(HH,CONVERT(TIME,bDT))/3)*3, CONVERT(DATETIME,CONVERT(DATE,bDT)))

答案 2 :(得分:0)

试试这个

select a.aDT ,
       a.aVal,
       (select sum(b.bVal) from table2 b where b.bDT between a.aDT and dateadd(hh,3,a.aDT) )
from table1 a

三小时之间的总和