Sql server 2005 如何在SQLServer2005中平均/求和一天的数据

Sql server 2005 如何在SQLServer2005中平均/求和一天的数据,sql-server-2005,aggregate-functions,aggregation,Sql Server 2005,Aggregate Functions,Aggregation,我正在尝试平均一天内SQLServer2005中的数据。如果我使用简单查询作为 SELECT timestamp, FEED FROM ROASTER_FEED ORDER timestamp 数据: 我不知道当有人在一个月内选择一个日期,并且只显示该天的平均值/总和时,如何计算提要的平均值 例如,在结果中,如果我选择日期为2011年7月2日。它会给我这样的东西: 02/07/2011 1234 (average value/or sum) 如果您需要经常这样做,有一种可能性:在表中添加三个

我正在尝试平均一天内SQLServer2005中的数据。如果我使用简单查询作为

SELECT timestamp, FEED
FROM ROASTER_FEED
ORDER timestamp
数据:

我不知道当有人在一个月内选择一个日期,并且只显示该天的平均值/总和时,如何计算提要的平均值

例如,在结果中,如果我选择日期为2011年7月2日。它会给我这样的东西:

02/07/2011 1234 (average value/or sum)

如果您需要经常这样做,有一种可能性:在表中添加三个计算列,分别表示日、月、年。这些列是根据
时间戳
列自动计算的,它们只是整数值,因此它们很容易在
分组中使用

为此,请使用以下T-SQL语句:

ALTER TABLE dbo.ROASTER_FEED ADD TSDay AS DAY(timestamp) PERSISTED
ALTER TABLE dbo.ROASTER_FEED ADD TSMonth AS MONTH(timestamp) PERSISTED
ALTER TABLE dbo.ROASTER_FEED ADD TSYear AS YEAR(timestamp) PERSISTED
现在,您可以根据自己的意愿轻松选择数据:

SELECT TSDay, TSMonth, TSYear, SUM(FEED)   -- use AVG(FEED) for average values
FROM dbo.ROASTER_FEED
WHERE TSYear = 2011 AND TSMonth = 8   -- or whatever you want to grab from the table!
ORDER BY timestamp
GROUP BY TSDay, TSMonth, TSYear

要获得一天的平均饲料,你可以使用这个

declare @Date datetime

set @Date = '20110702'

select @Date as [timestamp], avg(FEED) as AvgFeed
from ROASTER_FEED
where [timestamp] >= @Date and 
      [timestamp] < dateadd(day, 1, @Date)
declare@Date-datetime
设置@Date='20110702'
选择@Date作为[时间戳],选择avg(提要)作为AvgFeed
从烘焙炉进料
其中[时间戳]>=@日期和
[时间戳]
试试这个:

SELECT timestamp, sum(FEED)
FROM ROASTER_FEED
WHERE timestamp=....
GROUP BY timestamp

如果处理大量数据,速度可能会很慢,在这种情况下,您应该考虑使用一个额外的表来保存每天的预计算值。

@marc_\s找到了一个首选解决方案,即使用计算列来处理此问题,但若要动态处理,请丢弃时间戳数据以剪切时间分量。在我的示例中,我将其强制转换为包含0填充日期的10个字符的字段

;
WITH ROASTER_FEED ([timestamp],[Feed]) AS
(
SELECT CAST('02/07/2011 12:00:01' AS datetime),1246   
UNION ALL SELECT '02/07/2011 12:00:01',1234    
UNION ALL SELECT '02/07/2011 12:00:01',1387    
UNION ALL SELECT '02/07/2011 12:00:02',1425   
UNION ALL SELECT '02/07/2011 12:00:03',1263   

UNION ALL SELECT '02/07/2011 11:00:01',1153    
UNION ALL SELECT '02/07/2011 11:00:01',1348    
UNION ALL SELECT '02/07/2011 11:00:01',1387    
UNION ALL SELECT '02/07/2011 11:00:02',1425    
UNION ALL SELECT '02/07/2011 11:00:03',1223    

UNION ALL SELECT '03/07/2011 12:00:01',1226    
UNION ALL SELECT '03/07/2011 12:00:01',1245    
UNION ALL SELECT '03/07/2011 12:00:01',1384    
UNION ALL SELECT '03/07/2011 12:00:02',1225    
UNION ALL SELECT '03/07/2011 12:00:03',1363
)
SELECT
    -- Shear off the time value by forcing the date into date values
    -- If this was SQL Server 2008+, we'd just cast to date type and
    -- be done with it
    -- Chart for convert options
    -- http://msdn.microsoft.com/en-us/library/ms187928.aspx
    CONVERT(char(10), RF.[timestamp], 121) AS [timestamp]
,   COUNT(1) AS row_counts
,   SUM(RF.Feed) as ValuesSum 
,   AVG(RF.Feed) as Average
FROM 
    ROASTER_FEED RF
GROUP BY
    CONVERT(char(10), RF.[timestamp], 121)    
导致

timestamp   row_counts   ValuesSum  Average
2011-02-07  10           13091      1309
2011-03-07  5            6443       1288

我不是SQL高手,但我希望能做到:

SELECT SUM(ValueColumn) AS Total, AVG(ValueColumn) AS Average FROM YourTableName
WHERE RecordedTime >= @StartTime AND RecordedTime < @EndTime
从TableName中选择SUM(ValueColumn)作为总计,AVG(ValueColumn)作为平均值
其中RecordedTime>=@StartTime和RecordedTime<@EndTime
(其中@StartTime和@EndTime是由调用代码填充的参数)


(我不清楚如果找不到值得检查的记录会发生什么情况。)

上午7:40是00:00后460分钟

下午7:40是00:00后1180分钟

中午是00:00后1440分钟

DATEPART(hh,SomeDate)*60+DATEPART(mi,SomeDate)给出给定某个日期00:00后的分钟数

因此,您可以使用:

SELECT
    AVG(Temperature) As Dayshift
FROM Drye_data
WHERE DATEPART(hh, TimeStamp)*60 + DATEPART(mi, TimeStamp) BETWEEN 460 AND 1180
      AND @SelectedDate = CAST(FLOOR(CAST(TimeStamp AS FLOAT)) AS DATETIME)
至于夜班:

    SELECT
    AVG(Temperature) As Nigthshift
FROM Drye_data
WHERE (
        (DATEPART(hh, TimeStamp)*60 + DATEPART(mi, TimeStamp) BETWEEN 0 AND 460)
        AND @SelectedDate = DATEADD(dd, 1, CAST(FLOOR(CAST(TimeStamp AS FLOAT)) AS DATETIME))
      )
      OR 
      (
         (DATEPART(hh, TimeStamp)*60 + DATEPART(mi, TimeStamp) BETWEEN 1180 AND 1440) AND @SelectedDate = CAST(FLOOR(CAST(TimeStamp AS FLOAT)) AS DATETIME)
      )

从这里查看一些教程

我一直在寻找类似的东西,发现这个网站很有用,并认为它可能会有所帮助

这些数据是在数据库中,还是在文件中,还是什么?你用什么语言?什么语言?什么站台?这是一个SQL问题吗?如果是,服务器和版本是什么?除非您告诉我们更多信息,否则我们无法帮助您。这是Excel吗?通道MS SQL Server?这是什么类型的数据库?SQL小姐?MYSQL?Access?什么是Drye_数据表结构?请给出其中的一些示例记录。把sql放在标签里,它不起作用。它给了我614个相同的答案,时间戳记录的每一个记号谢谢。我一直试图搜索的是这个转换(char(10),RF.[timestamp],121)为[timestamp],我希望SQL在时间框架问题上更智能一些(我试过了。@starttime和@Endtime只是日期选择,而不是时间。我很抱歉。)stucked@Thao:这不是SQL的错-您应该让调用代码传递正确的DATETIME值。您可能可以让它在SQL中执行加法,但我个人会在调用代码中执行加法。我不清楚您的调用代码是什么你能提供更多的上下文吗?对不起,我有点慢。我是一个新的学习者。这是我写的。它让我从早上12点到晚上11:59:59选择转换(字符(10),时间戳,105)作为“白天时间”,平均(REPORTSROASTERFEED\u RATE\u VAL0)作为“平均饲料日”,从夜班分组转换(字符(10),时间戳,105)有(转换)(字符(10),时间戳,105)=@selectdate)@Thao:不,理想情况下,你不需要做任何转换-你应该能够在正确的时间作为时间戳传递。尽可能避免转换。非常感谢你的快速帮助。所以我今天再次尝试,这里是我想到的,当然,仍然是问题。非常感谢你的回答,我没有想到分解它就像那样。太酷了。但是我忘了报告必须能够选择任何一天(其他人可以选择一天,报告将在那天发布)。我应该把@selectdate放在哪里?非常感谢你。你的意思是报告是特定一天中每个班次的平均温度?是的,它是正确的。特定一天中的每个班次。白天由观看者选择。夜班很棘手,因为它是今天的一半,下一天的一半day@Thao-我用我认为正确的答案编辑了答案这就是解决方案。我用它将日期时间缩短到了白天。白班工作起来很有魅力。太神奇了。但是,夜班有点不合适。因为它是从今天的7:40到第二天的7:40。例如,2011年9月30日的夜班是从2011年9月30日的7:40到2011年10月1日的7:40。我可以使用(DATEPART(hh,TimeStamp)*60+DATEPART吗(MI,时间戳)介于1180到1900和@ SaleDeDe=…注意不鼓励,因此答案应该是寻找解决方案的终点(而不是另一个停留在引用中的时间,这往往会随着时间的推移而变得陈旧)。请考虑在这里添加一个独立的概要,保持链接作为参考。
SELECT
    AVG(Temperature) As Dayshift
FROM Drye_data
WHERE DATEPART(hh, TimeStamp)*60 + DATEPART(mi, TimeStamp) BETWEEN 460 AND 1180
      AND @SelectedDate = CAST(FLOOR(CAST(TimeStamp AS FLOAT)) AS DATETIME)
    SELECT
    AVG(Temperature) As Nigthshift
FROM Drye_data
WHERE (
        (DATEPART(hh, TimeStamp)*60 + DATEPART(mi, TimeStamp) BETWEEN 0 AND 460)
        AND @SelectedDate = DATEADD(dd, 1, CAST(FLOOR(CAST(TimeStamp AS FLOAT)) AS DATETIME))
      )
      OR 
      (
         (DATEPART(hh, TimeStamp)*60 + DATEPART(mi, TimeStamp) BETWEEN 1180 AND 1440) AND @SelectedDate = CAST(FLOOR(CAST(TimeStamp AS FLOAT)) AS DATETIME)
      )