AVG和GROUP BY

时间:2012-07-05 19:01:05

标签: sql sql-server group-by average

我有一组记录,我从中选择并平均各种数据,并按小时分组。似乎这个函数/查询做了很好的平均工作,因为我得到744记录没有问题。然而,从6月8日到6月16日,它似乎跳过了平均和分组。与数据一样大,我通过试图找到可能发生这种情况的原因进行梳理。看起来这些行中的数据与其他行中的数据没有什么不同,并且没有理由从6月8日到6月16日跳过记录。有NULLS,但我认为AVG会跳过这些数据?有没有人看过这种跳过记录的特殊模式,特别是因为它与AVG和GROUP BY功能有关?

日期格式:YYYY-MM-DD HH:MM:SS.000 数据库管理员:Microsoft Corporation的SQL Server Management Studio

工作数据链接(此数据已正确平均): https://docs.google.com/spreadsheet/ccc?key=0Av--kLXVY_a3dHA5UjBKYXc3UmRhQW9RN0NGbXl1NHc

非工作数据链接(由于某些原因,此数据已被完全跳过): https://docs.google.com/spreadsheet/ccc?key=0Av--kLXVY_a3dFZqX3RuYVNWYWpVemNmSS12bzhIOXc

用于平均和分组的查询:

`INSERT INTO AverageRawData(DateTime,
SCR1_EXHAUST_GAS_TEMP,SCR1_NOX_LEVEL,SCR1_NH3_FLOW_RATE,SCR1_O2_LEVEL,SCR1_NOx,
SCR2_EXHAUST_GAS_TEMP,SCR2_NOX_LEVEL,SCR2_NH3_FLOW_RATE,SCR2_O2_LEVEL,SCR2_NOx,
SCR3_EXHAUST_GAS_TEMP,SCR3_NOX_LEVEL,SCR3_NH3_FLOW_RATE,SCR3_O2_LEVEL,SCR3_NOx,
SCR4_EXHAUST_GAS_TEMP,SCR4_NOX_LEVEL,SCR4_NH3_FLOW_RATE,SCR4_O2_LEVEL,SCR4_NOx,
CAT1_FUEL_FLOW_RATE,CAT2_FUEL_FLOW_RATE,CAT3_FUEL_FLOW_RATE,
VOLVO1_FUEL_FLOW_RATE,VOLVO2_FUEL_FLOW_RATE,VOLVO3_FUEL_FLOW_RATE,VOLVO4_FUEL_FLOW_RATE,VOLVO5_FUEL_FLOW_RATE,
TOTAL_NOx)

SELECT MIN(DateTime),
AVG(Convert(decimal(10,3),SCR1_EXHAUST_GAS_TEMP)),
AVG(Convert(decimal(10,3),SCR1_NOX_LEVEL)),
AVG(Convert(decimal(10,3),SCR1_NH3_FLOW_RATE)),
AVG(Convert(decimal(10,3),SCR1_O2_LEVEL)),
AVG(Convert(decimal(10,3),SCR1_NOx)),
AVG(Convert(decimal(10,3),SCR2_EXHAUST_GAS_TEMP)),
AVG(Convert(decimal(10,3),SCR2_NOX_LEVEL)),
AVG(Convert(decimal(10,3),SCR2_NH3_FLOW_RATE)),
AVG(Convert(decimal(10,3),SCR2_O2_LEVEL)),
AVG(Convert(decimal(10,3),SCR2_NOx)),
AVG(Convert(decimal(10,3),SCR3_EXHAUST_GAS_TEMP)),
AVG(Convert(decimal(10,3),SCR3_NOX_LEVEL)),
AVG(Convert(decimal(10,3),SCR3_NH3_FLOW_RATE)),
AVG(Convert(decimal(10,3),SCR3_O2_LEVEL)),
AVG(Convert(decimal(10,3),SCR3_NOx)),
AVG(Convert(decimal(10,3),SCR4_EXHAUST_GAS_TEMP)),
AVG(Convert(decimal(10,3),SCR4_NOX_LEVEL)),
AVG(Convert(decimal(10,3),SCR4_NH3_FLOW_RATE)),
AVG(Convert(decimal(10,3),SCR4_O2_LEVEL)),
AVG(Convert(decimal(10,3),SCR4_NOx)),
AVG(Convert(decimal(10,3),CAT1_FUEL_FLOW_RATE)),
AVG(Convert(decimal(10,3),CAT2_FUEL_FLOW_RATE)),
AVG(Convert(decimal(10,3),CAT3_FUEL_FLOW_RATE)),
AVG(Convert(decimal(10,3),VOLVO1_FUEL_FLOW_RATE)),
AVG(Convert(decimal(10,3),VOLVO2_FUEL_FLOW_RATE)),
AVG(Convert(decimal(10,3),VOLVO3_FUEL_FLOW_RATE)),
AVG(Convert(decimal(10,3),VOLVO4_FUEL_FLOW_RATE)),
AVG(Convert(decimal(10,3),VOLVO5_FUEL_FLOW_RATE)),
AVG(Convert(decimal(10,3),TOTAL_NOx))
FROM jmusa_LOG1
GROUP BY DATEPART(DD,DateTime),DATEPART(HH,DateTime)`

1 个答案:

答案 0 :(得分:1)

假设您正在使用Oracle数据库,请尝试在没有数据的所有列上执行NVL(R1_EXHAUST_GAS_TEMP,0)。

这是来自docs.oracle:

  

除COUNT(*)和GROUPING之外的所有聚合函数都忽略空值。您可以在聚合函数的参数中使用NVL函数来将值替换为null。 COUNT永远不会返回null,但会返回数字或零。对于所有剩余的聚合函数,如果数据集不包含任何行,或者只包含带有null作为聚合函数参数的行,则该函数返回null。

正如他们所说,使用NVL可以解决您的问题。

链接:http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions001.htm