【问题标题】:How to calculate daily average frequency?如何计算日均频率?
【发布时间】:2017-07-17 19:52:30
【问题描述】:

我有这张桌子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;

【问题讨论】:

    标签: sql hive


    【解决方案1】:

    你真的很亲密。我会为此使用一个子选择:

    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);
    

    我很抱歉,我无法测试这个,但它应该能让你走上正确的道路。

    祝你好运!

    【讨论】:

    • 这似乎是唯一正确的答案 :-) (只是 ORDER 应该是记录员/人)
    • 谢谢dnoeth! OP 由 hourly_cnt 订购,只是想效仿。虽然我想你会想要它描述......
    【解决方案2】:

    如果我理解正确,您只需要数据中的天数。这成为分母:

    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 不支持这一点。

    【讨论】:

    • Hive 中没有整数运算,所以不需要乘以 1.0
    • @DuduMarkovitz 。 . .我倾向于默认这样做,所以我不必记住哪个数据库做什么。
    猜你喜欢
    • 2021-10-15
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多