【发布时间】:2021-12-07 23:53:48
【问题描述】:
我有三个栏目,发送组织、接收组织和参与者数量。对于每个发送组织,如何显示参与者人数最多的接收组织? 有些行的发送和接收值相同,所以我必须对这些行的参与者求和。
Es:
| SENDING | RECEIVING | PARTECIPANTS |
|---|---|---|
| A | B | 10 |
| A | C | 9 |
| A | B | 2 |
| B | C | 11 |
| B | D | 4 |
| B | D | 5 |
| C | E | 1 |
| Expected output | : |
|---|---|
| A | B |
| B | C |
| C | E |
【问题讨论】:
我有三个栏目,发送组织、接收组织和参与者数量。对于每个发送组织,如何显示参与者人数最多的接收组织? 有些行的发送和接收值相同,所以我必须对这些行的参与者求和。
Es:
| SENDING | RECEIVING | PARTECIPANTS |
|---|---|---|
| A | B | 10 |
| A | C | 9 |
| A | B | 2 |
| B | C | 11 |
| B | D | 4 |
| B | D | 5 |
| C | E | 1 |
| Expected output | : |
|---|---|
| A | B |
| B | C |
| C | E |
【问题讨论】:
我认为最好的方法是使用窗口函数:
SELECT sending, FIRST_VALUE(receiving) OVER ( PARTITION BY sending ORDER BY partecipants DESC ) receiving FROM ttable GROUP BY sending
实际上,我没有得到您关于某些值总和的问题的部分内容。如果您必须这样做,您可以将 ttable 替换为子查询 (SELECT SUM(...) ....)
【讨论】:
免责声明:此查询是在 MySQL 而非 Hive 中测试的。
你可以这样做:
select *
from (
select sending, receiving,
rank() over(order by sum(partecipants) desc) as rk
from t
group by sending, receiving
) x
where rk = 1
【讨论】: