表名:tx_friends 字段:num_cnt 好友数量;day 日期;rtime 时间戳;country 国家;os 手机系统;uid 用户id 1. 按上面的上报定义,编写hive sql 做一个好友中位数及平均数的报表。 一个用户 一天切N次好友列表时 会上报 n个同样的日期,n个不同的时间戳,n个同样的id
时间: 2024-02-23 18:00:15 浏览: 21
好的,以下是查询语句:
```
SELECT
day,
country,
os,
PERCENTILE(num_cnt, 0.5) as median_friends,
AVG(num_cnt) as avg_friends
FROM
tx_friends
GROUP BY
day,
country,
os;
```
这个查询语句会按照日期、国家和手机系统分组,然后计算每组的好友数量的中位数和平均数。注意到同一个用户一天内可能会上报多次,但是我们只需要统计一次,因此在这个查询中,我们没有使用uid字段。
相关问题
表名:tx_friends 字段:num_cnt 好友数量;day 日期;rtime 时间戳;country 国家;os 手机系统;uid 用户id 1. 按上面的上报定义,编写hive做一个好友中位数及平均数的报表。 一个用户 一天切N次好友列表时 会上报 n个同样的日期,n个不同的时间戳,n个同样的id
可以使用以下Hive SQL语句进行好友中位数和平均数的报表计算:
```
SELECT
day,
country,
os,
AVG(num_cnt) AS avg_num_cnt,
percentile_cont(0.5) WITHIN GROUP (ORDER BY num_cnt) AS median_num_cnt
FROM
tx_friends
GROUP BY
day,
country,
os;
```
这个查询将按天、国家和操作系统对好友数量进行分组,并计算平均值和中位数。其中,`percentile_cont(0.5) WITHIN GROUP (ORDER BY num_cnt)`表示按num_cnt字段升序排序后的中位数。
always @(posedge clk)begin if(state==2'd2) begin case(encode_data_in[3:0]) 4'd0:decode_data_out_r<=scope_cnt1; 4'd1:decode_data_out_r<=scope_cnt1+scope_cnt2; 4'd2:decode_data_out_r<=scope_cnt1+2*scope_cnt2; 4'd3:decode_data_out_r<=scope_cnt1+3*scope_cnt2; 4'd4:decode_data_out_r<=scope_cnt1+4*scope_cnt2; 4'd5:decode_data_out_r<=scope_cnt1+5*scope_cnt2; 4'd6:decode_data_out_r<=scope_cnt1+6*scope_cnt2; 4'd7:decode_data_out_r<=scope_cnt1+7*scope_cnt2; 4'd8:decode_data_out_r<=scope_cnt1+8*scope_cnt2; 4'd9:decode_data_out_r<=scope_cnt1+9*scope_cnt2; 4'd10:decode_data_out_r<=scope_cnt1+10*scope_cnt2; 4'd11:decode_data_out_r<=scope_cnt1+11*scope_cnt2; 4'd12:decode_data_out_r<=scope_cnt1+12*scope_cnt2; 4'd13:decode_data_out_r<=scope_cnt1+13*scope_cnt2; 4'd14:decode_data_out_r<=scope_cnt1+14*scope_cnt2; 4'd15:decode_data_out_r<=scope_cnt1+15*scope_cnt2; endcase end end
这段代码也是 Verilog HDL 语言的代码,是一个基于时钟上升沿的状态机模块。当时钟上升沿到来时,如果当前状态为 2,则根据输入信号 encode_data_in[3:0] 来计算输出信号 decode_data_out_r 的值。具体来说,如果输入信号的值为 0,则输出信号的值为 scope_cnt1;如果输入信号的值为 1,则输出信号的值为 scope_cnt1+scope_cnt2;如果输入信号的值为 2,则输出信号的值为 scope_cnt1+2*scope_cnt2;如果输入信号的值为 3,则输出信号的值为 scope_cnt1+3*scope_cnt2;如果输入信号的值为 4,则输出信号的值为 scope_cnt1+4*scope_cnt2;如果输入信号的值为 5,则输出信号的值为 scope_cnt1+5*scope_cnt2;如果输入信号的值为 6,则输出信号的值为 scope_cnt1+6*scope_cnt2;如果输入信号的值为 7,则输出信号的值为 scope_cnt1+7*scope_cnt2;如果输入信号的值为 8,则输出信号的值为 scope_cnt1+8*scope_cnt2;如果输入信号的值为 9,则输出信号的值为 scope_cnt1+9*scope_cnt2;如果输入信号的值为 10,则输出信号的值为 scope_cnt1+10*scope_cnt2;如果输入信号的值为 11,则输出信号的值为 scope_cnt1+11*scope_cnt2;如果输入信号的值为 12,则输出信号的值为 scope_cnt1+12*scope_cnt2;如果输入信号的值为 13,则输出信号的值为 scope_cnt1+13*scope_cnt2;如果输入信号的值为 14,则输出信号的值为 scope_cnt1+14*scope_cnt2;如果输入信号的值为 15,则输出信号的值为 scope_cnt1+15*scope_cnt2。如果当前状态不是 2,则不做任何操作,输出信号的值保持不变。