0

我有一组记录,我从中选择和平均各种数据,并按小时分组。似乎这个函数/查询在平均方面做得很好,因为我得到了 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)`
4

1 回答 1

1

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

这是来自 docs.oracle:

除 COUNT(*) 和 GROUPING 之外的所有聚合函数都忽略空值。您可以在聚合函数的参数中使用 NVL 函数将值替换为空值。COUNT 从不返回 null,而是返回一个数字或零。对于所有剩余的聚合函数,如果数据集不包含行,或仅包含带有空值的行作为聚合函数的参数,则该函数返回空值。

正如他们所建议的,使用 NVL 应该可以解决您的问题。

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

于 2012-07-05T21:17:19.090 回答