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)

これら 2 つのクエリを別々に実行すると、それぞれ 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)

同じ重要な違いがここにも当てはまります。1 つは IS NULL で、もう 1 つは IS NOT NULLであることに注意してください。

なぜこれが起こっているのですか?そして、最初に言及したクエリが 881 件の結果をすべて返さない原因となっている可能性のある間違いは何ですか?

DB マネージャー: 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 値の両方を取ります。

つまり、2 つの個別のクエリで定義されたグループが重複しています。

于 2012-07-06T18:22:45.163 に答える
2

HH、DD、および NULL(SCR1_EXHAUST) の組み合わせが一意であると本当に確信していますか?

2 つの行の DateTime が異なっていても、HH と DD が同じで、1 つの行に NULL SCR1_EXHAUST_GAS_TEMP があり、もう 1 つの行に null がない場合、GROUP BY はそれらを 1 つの行にマージします。

この場合、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 の個別の値を抽出して最初のセットを準備します。これが「カレンダー」になります。
  • YYYY、MM、DD、および HH でグループ化して、null 以外の temp 値を平均化する 2 番目のセットを準備します。
  • カレンダーとデータを LEFT JOIN し、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 に答える