我有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),但这似乎没有回复我正在寻找的东西。
思想?
答案 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
三小时之间的总和