[英]How to create scope or function to select records in specific hours in specific day?
[英]How to select records grouped by the hour of the day including hours that have no records
我在Oracle數據庫中有一個表,其中包含用戶在我們的系統之一中執行的操作。 它用於統計分析,我需要顯示在給定日期執行的操作數,並按一天中的小時進行分組。
我有一個很好的查詢,但是,它不顯示不包含任何操作的一天中的小時(顯然是因為該小時沒有要顯示的記錄)。
例如,查詢:
SELECT TO_CHAR(event_date, 'HH24') AS during_hour,
COUNT(*)
FROM user_activity
WHERE event_date BETWEEN to_date('15-JUN-2010 14:00:00', 'DD-MON-YYYY HH24:MI:SS')
AND to_date('16-JUN-2010 13:59:59', 'DD-MON-YYYY HH24:MI:SS')
AND event = 'user.login'
GROUP BY TO_CHAR(event_date, 'HH24')
ORDER BY during_hour;
(不要注意奇數的開始和結束日期,它們之所以這樣,是因為它們在格林尼治標准時間(GMT),而我是GMT + 10,但這是一個單獨的問題,除非它影響回答此問題的能力)
這將產生以下結果集:
DURING_HOUR COUNT(*)
---------------------- ----------------------
00 12
01 30
02 18
03 20
04 12
05 24
06 20
07 4
23 8
9 rows selected
如何修改該查詢以顯示一天中包含0個事件的小時?
我搜索了Stack Overflow,發現了一些類似的問題,但並不能回答我的特定問題。
感謝您的協助。
SELECT h.hrs, NVL(Quantity, 0) Quantity
FROM (SELECT TRIM(to_char(LEVEL - 1, '00')) hrs
FROM dual
CONNECT BY LEVEL < 25) h
LEFT JOIN (SELECT TO_CHAR(event_date, 'HH24') AS during_hour,
COUNT(*) Quantity
FROM user_activity u
WHERE event_date BETWEEN
to_date('15-JUN-2010 14:00:00', 'DD-MON-YYYY HH24:MI:SS') AND
to_date('16-JUN-2010 13:59:59', 'DD-MON-YYYY HH24:MI:SS')
AND event = 'user.login'
GROUP BY TO_CHAR(event_date, 'HH24')) t
ON (h.hrs = t.during_hour)
ORDER BY h.hrs;
一種選擇是創建一個包含24行的單獨表:00-> 23。
然后外部加入反對。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.