某些选定记录SQL的平均值

某些选定记录SQL的平均值,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有下表: ID myDate myTime Value 1 2014-06-01 00:00:00 100 2 2014-06-01 01:00:00 125 3 2014-06-01 02:00:00 132 4 2014-06-01 03:00:00 139 5 2014-06-01 04:00:00 145 6 2014-06-01 05:00:00 1

我有下表:

ID     myDate       myTime     Value
1      2014-06-01   00:00:00   100
2      2014-06-01   01:00:00   125
3      2014-06-01   02:00:00   132
4      2014-06-01   03:00:00   139
5      2014-06-01   04:00:00   145
6      2014-06-01   05:00:00   148
FF.
24     2014-06-01   23:00:00   205
25     2014-06-02   00:00:00   209
26     2014-06-02   01:00:00   215
27     2014-06-02   02:00:00   223
FF.
48     2014-06-02   23:00:00   280
49     2014-06-03   00:00:00   290
50     2014-06-03   01:00:00   302
FF.
71     2014-06-03   22:00:00   389
72     2014-06-03   23:00:00   400
73     2014-06-04   00:00:00   405
FF.
我想计算从01:00:00到次日00:00:00的所有记录的平均值。例如:

我想知道“2014-06-01”的平均值。然后平均值为2014-06-01 01:00:00到2014-06-02 00:00:00之间的值

如何使用SQL select语句执行此操作


谢谢。

我一开始是从日期中减去一个小时来确定日期与天数的对应关系。加上日期和时间,然后减去一小时

然后是一个简单的小组。这将在MS SQL Server上工作

WITH CorrectedDates AS (
  SELECT 
  DateAdd(hh,-1,DateAdd(hh,DatePart(hh,myTime),myDate)) AS newDate, Value
  FROM table1
  )
SELECT CAST(newDate AS DATE) AS MainDate, AVG(Value)
FROM CorrectedDates cd
GROUP BY CAST(newDate AS DATE)
要仅获取一个日期,只需在FROM和GROUP BY子句之间添加以下内容:

WHERE NewDate = '2014-6-1' 

我有我自己的答案:检查一下


谢谢。

这听起来像是一个简单的分组-你试过了吗?@Skram,按哪个栏目分组?这就是为什么很难做到的。因为你想跨越这两天,你不能做一个简单的分组。嗨,我试过你的语法。但结果似乎不正确。与小提琴一样,“2014-06-01”从01:00:00开始的平均值是200300300300300。结果应该是280,再检查一遍。我将数据设置为在0100时增加100,也就是说,从那天的24小时开始到第二天的0000。如果我做的不正确,请调整小提琴,使每天都可以被100整除,然后发布链接。嗨,KingOfAllTrades,我尝试了你的语法,并给了我一个错误。错误为.Net SqlClient数据提供程序,错误消息:无法在日期调用方法。那么?如果使用fiddle,您可以从“运行SQl”按钮旁边的下拉列表中选择“markdown output”,然后将结果复制并粘贴到您的答案中,以在此处获得格式良好的答案。我的查询可以在具有相同结果的数据集上工作@金融通,你能用条件语句修改吗?比如说,我只想看看“2014-06-01”的平均值。我将投票并标出你的答案。
if (OBJECT_ID('[TempDB]..[#DataTable]') is not null)
    drop table #DataTable
create table #DataTable (
    [Date] date,
    [Time] time,
    Value int
)
declare @inputDate date
set @inputDate = '2014-6-1'

insert into #DataTable values
(cast('2014-6-1' as date), '0:0', 100),
(cast('2014-6-1' as date), '1:0', 200),
(cast('2014-6-1' as date), '2:0', 300),
(cast('2014-6-1' as date), '3:0', 400),
(cast('2014-6-1' as date), '4:0', 500),
(cast('2014-6-1' as date), '5:0', 600),
(cast('2014-6-1' as date), '6:0', 700),
(cast('2014-6-1' as date), '7:0', 800),
(cast('2014-6-1' as date), '8:0', 900),
(cast('2014-6-1' as date), '9:0', 1000),
(cast('2014-6-1' as date), '10:0', 1100),
(cast('2014-6-1' as date), '11:0', 1200),
(cast('2014-6-1' as date), '12:0', 1300),
(cast('2014-6-1' as date), '13:0', 1400),
(cast('2014-6-1' as date), '14:0', 1500),
(cast('2014-6-1' as date), '15:0', 1600),
(cast('2014-6-1' as date), '16:0', 1700),
(cast('2014-6-1' as date), '17:0', 1800),
(cast('2014-6-1' as date), '18:0', 1900),
(cast('2014-6-1' as date), '19:0', 2000),
(cast('2014-6-1' as date), '20:0', 2100),
(cast('2014-6-1' as date), '21:0', 2200),
(cast('2014-6-1' as date), '22:0', 2300),
(cast('2014-6-1' as date), '23:0', 2400),
(cast('2014-6-2' as date), '0:0', 2500),
(cast('2014-6-2' as date), '1:0', 2600),
(cast('2014-6-2' as date), '2:0', 2700),
(cast('2014-6-2' as date), '3:0', 2800),
(cast('2014-6-2' as date), '4:0', 2900),
(cast('2014-6-2' as date), '5:0', 3000),
(cast('2014-6-2' as date), '6:0', 3100),
(cast('2014-6-2' as date), '7:0', 3200),
(cast('2014-6-2' as date), '8:0', 3300),
(cast('2014-6-2' as date), '9:0', 3400),
(cast('2014-6-2' as date), '10:0', 3500),
(cast('2014-6-2' as date), '11:0', 3600),
(cast('2014-6-2' as date), '12:0', 3700),
(cast('2014-6-2' as date), '13:0', 3800),
(cast('2014-6-2' as date), '14:0', 3900),
(cast('2014-6-2' as date), '15:0', 4000),
(cast('2014-6-2' as date), '16:0', 4100),
(cast('2014-6-2' as date), '17:0', 4200),
(cast('2014-6-2' as date), '18:0', 4300),
(cast('2014-6-2' as date), '19:0', 4400),
(cast('2014-6-2' as date), '20:0', 4500),
(cast('2014-6-2' as date), '21:0', 4600),
(cast('2014-6-2' as date), '22:0', 4700),
(cast('2014-6-2' as date), '23:0', 4800)

select @inputDate Tanggal, avg(d.Value) [Rata-rata]
from #DataTable d
where
    (d.[Date] = @inputDate and d.[Time] <> '0:0')
    or (d.[Date] = DATEADD(day, 1, @inputDate) and d.[Time] = '0:0')