一行中8小时轮班的平均值,按天分组

时间:2014-12-08 18:09:12

标签: sql-server date datetime join group-by

我有一个包含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)  

2 个答案:

答案 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