2017-07-17 125 views
0

我有這個表my_table如何計算日平均頻率?

recorder_id person_id  day 
A1    1    2017-06-03 12:30 
A1    1    2017-06-03 12:45 
B1    1    2017-06-03 12:50 
A1    2    2017-06-03 16:40 
B1    2    2017-06-03 16:45 
B1    2    2017-06-03 18:20 
A1    1    2017-06-04 11:22 

我想知道每個人多少次經過平均每天每個記錄。例如,ID爲1的人平均每天經過記錄器A1 1.5次,而人2平均每天經過該記錄器0.5次(因爲該人沒有2017-06-04的記錄)。 B1應用相同的邏輯。

recorder_id person_id daily_average_per_person 
A1   1   1.5 
A1   2   0.5 
B1   1   0.5 
B1   2   1.0 

我該如何得到這個結果?

我嘗試此查詢,但我不知道該怎麼每個獨特的人計算,平均每天:

SELECT recorder_id, person_id, 
     to_date(day) as hour, 
     count(*) as hourly_count 

FROM  my_table 

GROUP BY recorder_id, person_id, to_date(day) 

ORDER BY hourly_count; 

回答

1

如果我理解正確的話,你只需要幾天的數據的數量。這成爲分母:

SELECT recorder_id, person_id, 
     count(*)/numdays 
FROM t CROSS JOIN 
    (SELECT COUNT(DISTINCT to_date(day)) as numdays 
     FROM t 
    ) tt 
GROUP BY recorder_id, person_id, numdays 
ORDER BY recorder_id, person_id; 

在其他數據庫,你可以使用COUNT(DISTINCT)作爲窗口函數。我不認爲Hive支持這一點。

+0

Hive中沒有整數算術,所以不需要乘以1.0 –

+0

@DuduMarkovitz。 。 。我傾向於默認這樣做,所以我不必記住哪個數據庫做了什麼。 –

3

你真的很親密。我會使用一個子選擇的這一個:

SELECT recorder_id, person_id, avg(day_count) day_avg 
    FROM 
     (SELECT recorder_id, person_id, 
       to_date(day) as record_day, 
       count(*) as day_count 
      FROM my_table 
      GROUP BY recorder_id, person_id, to_date(day)) tmp_tbl 
GROUP BY recorder_id, person_id 
ORDER BY avg(day_count); 

我很抱歉,我不是在一個地方,我可以測試這一點,但它應該讓你正確的道路。

祝你好運!

+0

感謝dudu,添加到外層查詢組。 – Ckratide

+0

這似乎是唯一正確的答案:-)(只需ORDER應由記錄器/人) – dnoeth

+0

謝謝dnoeth! OP有按hourly_cnt命令,只是試圖跟隨。雖然我想象你會想要它desc ... – Ckratide