【问题标题】:AVG and GROUP BYAVG 和 GROUP BY
【发布时间】:2012-07-05 19:01:05
【问题描述】:

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

【问题讨论】:

  • 您能否发布示例数据、期望的结果以及您已经尝试过的内容?
  • 您的数据可能有问题。
  • 以前有没有人看到或遇到过这个错误?,我们不知道错误是什么,您需要指定并举例说明发生了什么
  • 答案:D. 信息不足。
  • 道歉我是这个论坛的新手。我希望我的编辑进一步澄清了我的问题。

标签: sql sql-server group-by average


【解决方案1】:

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

这是来自 docs.oracle:

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

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

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

【讨论】:

  • 对 SQL Server 使用 ISNULL()。抱歉给您带来了困惑……这是一个很好的例子:msdn.microsoft.com/en-us/library/aa933210(v=sql.80).aspx
  • 罗伯托,我尝试了解决方案。我似乎仍然不想返回 6 月 8 日到 6 月 16 日之间日期的平均值。
  • 您能告诉我数据库中 DateTime 列的数据类型吗?当你只在那个领域分组时会发生什么?日期会出现吗?我在理解您在 google 文档上发布的数据转储是原始数据或查询结果数据时遇到了一些麻烦
  • 数据类型是日期时间,格式为 yyyy-mm-dd hh:mm:ss.000 ...当我仅在该字段上分组时,我没有得到每小时平均值,我得到了列出的所有时间我不想要。
  • 明白.. 我只是想缩小问题的范围。你原来的声明说“6 月 8 日到 6 月 16 日,它似乎跳过了平均和分组”。我将其解释为,您在结果集中看不到该日期,对吗?如果您只对“DATEPART(DD,DateTime),DATEPART(HH,DateTime)”进行分组,那么您应该会在结果集中看到 6 月 8 日,对吗?如果不是,那么这就缩小了问题的范围。如果你这样做了,那么我们需要查看# 字段。希望这是有道理的.. 还有一件事,你为什么不选择 "DATEPART(DD,DateTime),DATEPART(HH,DateTime)".. 我看到你只选择 MIN(datetime)
猜你喜欢
  • 2012-09-18
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 2019-05-05
  • 1970-01-01
相关资源
最近更新 更多