たとえば、すべての日の05:00から06:00の間にコンピューターがアクティブだった回数のカウントを生成するのではなく、一度に1日のデータのみをカウントするように、このクエリを強化する必要があります。アクティブとして記録されたとき。また、コンピューターがまったくアクティブであると記録されていないときに、何時間もゼロカウントが生成されることを心配する必要があります。ただし、SQLを多かれ少なかれ機能するものに変更することはできます。
SELECT EXTRACT(HOUR FROM occurred) AS hr, COUNT(*) AS count
FROM tablename
WHERE computer = 'computername' -- corrected (" ⟶ ')
GROUP BY EXTRACT(HOUR FROM occurred)
ORDER BY 1
構文的には、それは正しいと思います(私は思います)。
これは、特定の日付を定義するための多くの可能な方法の1つです。より信頼性の高いデータを取得するには、タイムゾーンを指定する必要がある場合があります。
SELECT EXTRACT(HOUR FROM occurred) AS hr, COUNT(*) AS count
FROM tablename
WHERE computer = 'computername' -- corrected (" ⟶ ')
AND occurred >= TIMESTAMP '2012-08-02 00:00:00'
AND occurred < TIMESTAMP '2012-08-03 00:00:00'
GROUP BY EXTRACT(HOUR FROM occurred)
ORDER BY 1
24時間の一部の時間帯にコンピューターのアクティビティがない場合でも、24時間すべてのデータを生成することは困難です。どういうわけか24時間のリストを作成し(さまざまな方法があります。PostgreSQLでどれが最も適切かはわかりません)、それをコンピューターアクティビティレコードの投影と外部結合します。
SELECT hh, COUNT(*)
FROM hours_00_to_23 AS h
LEFT JOIN
(SELECT EXTRACT(HOUR FROM occurred) AS hh
FROM tablename
WHERE computer = 'computername' -- corrected (" ⟶ ')
) AS a
ON a.hh = h.hh
GROUP BY hh
ORDER BY hh
基準を組み合わせて、特定の日付などのデータを取得できます。
警告:この回答で想定されているSQLを実行しようとして、DBMSに悩まされることはありませんでした。
3番目の問題を修正する方法がわかりません。2行目に「hours_00_to_23」という関係を取得することはできません。
hh
適切なタイプ(それ自体が興味深い質問—正しいタイプは何ですか)の列を含む(一時的な?)テーブルを作成する必要があります。値0から23が入力されます。考えられる厄介なブルートフォースソリューション(議論の余地のあるタイプ)は次のとおりです。 :
CREATE TABLE hours_00_to_23(hh INTEGER NOT NULL PRIMARY KEY);
INSERT INTO hours_00_to_23 VALUES(0);
INSERT INTO hours_00_to_23 VALUES(1);
...
INSERT INTO hours_00_to_23 VALUES(23);
同じ効果を達成する方法はおそらく他にもあります。