Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 分组并以3小时为增量加入_Sql Server_Tsql_Sql Server 2012 - Fatal编程技术网

Sql server 分组并以3小时为增量加入

Sql server 分组并以3小时为增量加入,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,我有两个表-一个表每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

我有两个表-一个表每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)的值/datetime,在第三列中包含来自b(b.bVal)的值之和。我试过分组方式(DATEPART(HOUR,bDT)%3),但这似乎并没有返回我想要的结果


想法?

试试这样:

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

试着这样做:

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

试着这样做:

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

试着这样做:

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)))
试试这个

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
三小时之和

试试这个

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
三小时之和

试试这个

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
三小时之和

试试这个

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

三小时之和

以下内容将把秒值四舍五入到最接近的三小时间隔。例如,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

以下内容将秒值四舍五入至最接近的三小时间隔。例如,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

以下内容将秒值四舍五入至最接近的三小时间隔。例如,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

以下内容将秒值四舍五入至最接近的三小时间隔。例如,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


提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如,
sql-server-2014
)标记数据库问题很有帮助。语法和功能的差异往往会影响答案。你很接近。尝试使用
datepart(hour,bDT)/3
。提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如
sql-server-2014
)标记数据库问题是很有帮助的。语法和功能的差异往往会影响答案。你很接近。尝试使用
datepart(hour,bDT)/3
。提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如
sql-server-2014
)标记数据库问题是很有帮助的。语法和功能的差异往往会影响答案。你很接近。尝试使用
datepart(hour,bDT)/3
。提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如
sql-server-2014
)标记数据库问题是很有帮助的。语法和功能的差异往往会影响答案。你很接近。试试
datepart(hour,bDT)/3
。我有一个数据问题需要解决,但我想你已经解决了。一旦我再检查一遍,我会把它打上绿色的复选标记。谢谢好的,非常优雅。。。除了,在午夜值上,我的总和为空。@谢谢你的反馈!我添加了
%24
以将晚上9点到午夜之间的值转换为0小时,而不是24小时。让我知道这对你是否有效。我有一个数据问题需要解决,但我想你已经解决了。一旦我再检查一遍,我会把它打上绿色的复选标记。谢谢好的,非常优雅。。。除了,在午夜值上,我的总和为空。@谢谢你的反馈!我添加了
%24
以将晚上9点到午夜之间的值转换为0小时,而不是24小时。让我知道这对你是否有效。我有一个数据问题需要解决,但我想你已经解决了。一旦我再检查一遍,我会把它打上绿色的复选标记。谢谢好的,非常优雅。。。除了,在午夜值上,我的总和为空。@谢谢你的反馈!我添加了
%24
以将晚上9点到午夜之间的值转换为0小时,而不是24小时。让我知道这对你是否有效。我有一个数据问题需要解决,但我想你已经解决了。一旦我再检查一遍,我会把它打上绿色的复选标记。谢谢好的,非常优雅。。。除了,在午夜值上,我的总和为空。@谢谢你的反馈!我添加了
%24
以将晚上9点到午夜之间的值转换为0小时,而不是24小时。现在让我知道这是否对你有效。