我有一个包含2列的SQL Server表(tbl):ts
(时间戳)和val
(值)。我想做一个选择,返回四列:第一个是日,第二个是从前一天晚上10点到早上6点的值的平均值,第三行是从早上6点到下午2点的值的平均值,第四行是row包含从下午2点到晚上10点的存储值的平均值。因此,平均每天8小时,而不是午夜,从前一天晚上10点开始。
这是我到目前为止的查询:http://sqlfiddle.com/#!3/41334/2
我有整个24小时(从晚上10点)的平均值,但现在我被卡住了。我想我可以在8小时内做出3个选择,然后在当天加入他们,但我不知道我是怎么回事,也不知道我是在正确的轨道上。请帮忙。
我希望使用我的示例数据得到的结果:
DAY | AVG_NITE | AVG_MORN | AVG_AFTN
2014.12.07 | 3.75 | 5.6667 | 4.5714
2014.12.08 | 4.6 | 5.6 | 5.4
2014.12.09 | 5.5 | (null) | (null)
答案 0 :(得分:2)
下面的代码产生所需的输出。它使用CTE,但您可以将它们更改为子查询或视图。
WITH tbl2 AS (
SELECT DATEADD(hour, 2, ts) AS ts2
,val
FROM tbl
)
, tbl_hours AS (
SELECT convert(varchar, ts2,102) AS [day]
,ROUND(DATEDIFF(hour, cast(ts2 AS DATE), ts2)/8,0) AS period
,val
FROM tbl2
)
SELECT
[day]
,AVG( case when period = 0 then val else null end) AS [avg_nite]
,AVG( case when period = 1 then val else null end) AS [avg_morn]
,AVG( case when period = 2 then val else null end) AS [avg_aftn]
FROM tbl_hours
GROUP BY [day]
答案 1 :(得分:0)
select convert(varchar, dateadd(hour,2,ts), 102) as day,
avg(val) as avg_fullday
,avg(case when dateadd(day, -1, datepart(hour, ts)) in (22,23)
or DATEPART(hour, ts) in (0,1,2,3,4,5)
then (val) end)'Nite'
,avg(case when DATEPART(hour, ts) in( 6,7,8,9,10,11,12,13)
then (val) end) 'Morn'
,avg(case when DATEPART(hour, ts) in (14,15,16,17,18,19,20,21) then (val) end) 'Aftn'
from #tbl
group by convert(varchar, dateadd(hour,2,ts), 102);
drop table #tbl