2015-12-14 78 views
1

我與此查詢掙扎,這裏是表設置:查詢與內選擇和集團通過

date  | time | count 
---------------------------- 
12/12/2015 | 0:00 | 8 
12/12/2015 | 1:00 | 19 
12/12/2015 | 2:00 | 36 
12/13/2015 | 0:00 | 12 
12/13/2015 | 1:00 | 22 
12/13/2015 | 2:00 | 30 
12/14/2015 | 0:00 | 14 
12/14/2015 | 1:00 | 26 
12/14/2015 | 2:00 | 38 

我想我的查詢返回的內容是這樣的:

date  | time | count | DAY  | AVG/HR | AVG/DAY 
--------------------------------------------------------- 
12/12/2015 | 0:00 | 8  | MONDAY | 11.33 | 63 
12/12/2015 | 1:00 | 19 | MONDAY | 22.33 | 63 
12/12/2015 | 2:00 | 36 | MONDAY | 34.67 | 63 
12/13/2015 | 0:00 | 12 | TUESDAY | 11.33 | 64 
12/13/2015 | 1:00 | 22 | TUESDAY | 22.33 | 64 
12/13/2015 | 2:00 | 30 | TUESDAY | 34.67 | 64 
12/14/2015 | 0:00 | 14 | WEDNESDAY | 11.33 | 78 
12/14/2015 | 1:00 | 26 | WEDNESDAY | 22.33 | 78 
12/14/2015 | 2:00 | 38 | WEDNESDAY | 34.67 | 78 

所以基本上這是返回所有行(表中將有數月的數據,每天有24個記錄/小時)。並添加一週中的一天,以及每小時的平均計數以及一週中每天的平均計數。最後兩個是我正在努力的。這是我到目前爲止:

SELECT DATE, TIME, COUNT, 
    TO_CHAR(DATE, 'DAY'), 
    (SELECT AVG(t2.COUNT) 
     FROM tableXX t2 
     WHERE t2.time = t1.time 
    GROUP BY t2.time) AS AvgPerHr 
    (SELECT AVG(t2.COUNT) 
     FROM tableXX t2 
     WHERE TO_CHAR(t2.DATE, 'DAY') = TO_CHAR(t1.DATE, 'DAY') 
    GROUP BY TO_CHAR(t2.DATE, 'DAY')) AS AvgPerDay 
FROM tableXX t1 
ORDER BY DATE, TO_DATE(TIME, 'hh24:mi') ASC; 

任何建議,將不勝感激,上述查詢返回數據,但它絕對不準確。

+0

我沒有得到AVG/HR&AVG/DAY的邏輯。你能否提供這些邏輯的細節? –

+0

@ThitLwinOo因此,表中每個日期都有24條記錄(每天每個小時)。我希望能得到每小時的平均值。所以我想看看凌晨1點(01:00)的整體平均值是多少。至於平均每日,這只是一週中的每天平均值。那麼我們週一的平均數是多少?我明白這有點令人困惑,我試圖在我上面的結果表模擬中解釋它,但這很困難。 – Dan

回答

1

嘗試:

SELECT "DATE", "TIME", "COUNT", TO_CHAR(DATE, 'DAY') "DAY, 
     avg("COUNT") Over (partition by "TIME") "AVG/HR", 
     SUM("COUNT") Over (partition by "DATE") "AVG/DAY" 
FROM tablexx 
ORDER BY 1; 

我您的示例的第一行中使用SUM("COUNT")代替AVG("COUNT"),因爲63似乎是每天總和,而不是平均。

+0

感謝您的回答。對不起,我把那個搞砸了,是的,這是整天的總和,但它會是那個總和的平均值。所以,假設你正在跟隨我上面和下一個星期一點擊的結果,那麼它應該在AVG/DAY字段中具有相同的數據,以便每個其他星期一...他們的每日總和只會被平均在一起。對困惑感到抱歉 – Dan

2

這可以通過使用分析函數來解決。

SELECT DATE, TIME, COUNT, 
    TO_CHAR(DATE, 'DAY'), 
    AVG(t1.COUNT) 
     OVER (PARTITION BY TIME) AS AvgPerHr, 
    AVG(t1.COUNT) 
     OVER (PARTITION BY TO_CHAR(DATE, 'DAY')) AS AvgPerDay 
FROM tableXX t1 
ORDER BY DATE, TO_DATE(TIME, 'hh24:mi') ASC;