2017-07-17 110 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