0

我有 881 行下面的查询应该返回,但只返回 744:

SELECT MIN(DateTime),AVG(ISNULL((Convert(decimal(10,3),SCR1_EXHAUST_GAS_TEMP)),0))
FROM jmusa_LOG1
GROUP BY DATEPART(HH,DateTime),DATEPART(DD,DateTime)
ORDER BY MIN(DateTime)

现在,如果我分别运行这两个查询,我分别得到 588 和 293,这等于我需要的 881:

SELECT MIN(DateTime),AVG(ISNULL((Convert(decimal(10,3),SCR1_EXHAUST_GAS_TEMP)),0))
FROM jmusa_LOG1
WHERE SCR1_EXHAUST_GAS_TEMP IS NULL
GROUP BY DATEPART(HH,DateTime),DATEPART(DD,DateTime)
ORDER BY MIN(DateTime)

上述语句的主要区别在于 WHERE 语句。

SELECT MIN(DateTime),AVG(ISNULL((Convert(decimal(10,3),SCR1_EXHAUST_GAS_TEMP)),0))
FROM jmusa_LOG1
WHERE SCR1_EXHAUST_GAS_TEMP IS NOT NULL
GROUP BY DATEPART(HH,DateTime),DATEPART(DD,DateTime)
ORDER BY MIN(DateTime)

此处也存在相同的关键差异,请注意其中一个具有 IS NULL 和另一个 IS NOT NULL的区别

现在有人现在为什么会发生这种情况?我可能的错误是什么导致第一次提到的查询不返回所有 881 结果?

数据库管理器:SQL Server 2008 R2 和 SSMS 日期格式(如果需要):YYYY-MM-DD HH:MM:SS.000

4

3 回答 3

3

您有以下组合:

DATEPART(HH,DateTime),DATEPART(DD,DateTime)

其中 DATEPART(HH,DateTime),DATEPART(DD,DateTime) 采用 NULL 和非 NULL 值。

换句话说,由两个单独的查询定义的组重叠。

于 2012-07-06T18:22:45.163 回答
2

您真的确定 HH、DD 和 NULL(SCR1_EXHAUST) 的组合是唯一的吗?

如果两行,即使它们具有不同的 DateTimes,但设法具有相同的 HH 和 DD,并且一个具有 NULL SCR1_EXHAUST_GAS_TEMP 而另一个具有不同的空相同,则 GROUP BY 会将它们合并为一行。

在这种情况下,您也需要在 ISNULL(SCR1_EXHAUST_GAS_TEMP) 上进行分组。

SELECT MIN(DateTime),AVG(ISNULL((Convert(decimal(10,3),SCR1_EXHAUST_GAS_TEMP)),0))
FROM jmusa_LOG1
GROUP BY ISNULL(SCR1_EXHAUST_GAS_TEMP, 0)=0, DATEPART(HH,DateTime),DATEPART(DD,DateTime)
ORDER BY MIN(DateTime)

...否则,也许 744 行实际上是您需要的。

现在,如果您想查看所有日期,但对于其中一些日期,您有垃圾值,那么您需要:

  • 通过提取 YYYY、MM、DD、HH 的不同值来准备第一组,这将是您的“日历”
  • 准备第二组,您将在其中平均非空值 temp,按 YYYY、MM、DD 和 HH 分组
  • LEFT 将日历与数据连接起来,在 YYYY、MM、DD 和 HH 上连接并获得这些数据,加上 TEMP,并按 y、m、d、h 排序。

这会给你类似的东西,

Year Mo Da HH Temp
2012 07 07 00  750
2012 07 07 01  633
2012 07 07 02  NULL    <-- from 02:00 to 02:59 we only have junk!
2012 07 07 03  660     (actually, when going from summer time to winter time...)
2012 07 07 04  680
于 2012-07-06T18:31:45.530 回答
1

以下查询应向您显示 2 组中重叠的行:

SELECT DATEPART(HH,DateTime),DATEPART(DD,DateTime)
FROM jmusa_LOG1
WHERE SCR1_EXHAUST_GAS_TEMP IS NULL
GROUP BY DATEPART(HH,DateTime),DATEPART(DD,DateTime)

intersect

SELECT DATEPART(HH,DateTime),DATEPART(DD,DateTime)
FROM jmusa_LOG1
WHERE SCR1_EXHAUST_GAS_TEMP IS NOT NULL
GROUP BY DATEPART(HH,DateTime),DATEPART(DD,DateTime)
于 2012-07-06T18:40:18.447 回答