group并选择max-pair-sql

hmae6n7t  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(355)

我有一个有两列的表。

  1. create table txns(
  2. person varchar(255),
  3. fruit varchar(255)
  4. );

这是一个日志表。我这儿有小提琴。
这是我用sql查询所能得到的。
本质上,对每个人来说,这是他吃得最多的水果。
我有oracle和mysql。将来,它还将部署在hadoop上(通过hive/impala等)。因此,一个非db中心的答案将是最好的。但请也提供一个数据库为中心的答案,如果有这样的唯一。

ghhaqwfi

ghhaqwfi1#

下面的查询将同时在oracle和mysql中运行。

  1. select k.person, k.fruit from
  2. (
  3. select person,fruit,count(fruit) as cnt
  4. from txns
  5. group by person,fruit
  6. ) k
  7. join
  8. (
  9. select t.person,max(t.cnt) mxCnt
  10. from
  11. (
  12. select person,fruit,count(fruit) as cnt
  13. from txns
  14. group by person,fruit
  15. )t
  16. group by t.person
  17. ) s
  18. on s.person = k.person
  19. and s.mxCnt = k.cnt
  20. order by k.person
展开查看全部
vom3gejh

vom3gejh2#

sql小提琴
oracle 11g r2架构设置:

  1. create table txns(
  2. person varchar(255),
  3. fruit varchar(255)
  4. );
  5. insert into txns
  6. values ('alpha','apple');
  7. insert into txns
  8. values ('charlie','cherry');
  9. insert into txns
  10. values ('bravo','banana');
  11. insert into txns
  12. values ('alpha','apple');
  13. insert into txns
  14. values ('bravo','banana');
  15. insert into txns
  16. values ('alpha','apricot');
  17. insert into txns
  18. values ('bravo','berry');

查询1:

  1. with tab as (
  2. select person, fruit,count(1) cnt,
  3. max(count(1)) over (partition by person) m_cnt
  4. from txns
  5. group by person, fruit)
  6. select person, fruit, cnt, m_cnt
  7. from tab
  8. where cnt = m_cnt

结果:

  1. | PERSON | FRUIT | CNT | M_CNT |
  2. |---------|--------|-----|-------|
  3. | alpha | apple | 2 | 2 |
  4. | bravo | banana | 2 | 2 |
  5. | charlie | cherry | 1 | 1 |
展开查看全部
hmtdttj4

hmtdttj43#

对于oracle-

  1. select x.person,x.fruit
  2. from ( select person, fruit, count(*) ct,rank() over (partition by person
  3. order by count(*) desc) as rank
  4. from txns
  5. group by person, fruit) x
  6. where rank=1;

sql小提琴

“非db中心”的理念是-

你首先要为每个人找出一个特定的水果出现在table上的次数(或者水果被吃掉的次数)。这是由 person, fruit,count(*) .
然后你需要找出哪个水果是最吃的人 PERSON i、 e.基本上 fruit 那是最高的 RANK 或位置,在本例中为 DESC 结束顺序 count(*) 会把吃得最多的水果放在 RANK =1人( partition by person ).
一旦你完成排名,你只需要选择第一个 RANK 对于每个 Person 基本上是一个人吃得最多的水果。
这是一个完美的例子甲骨文的分析功能 RANK() .

你问为什么要用军衔?

你的老板可能会改变主意,可能会问你“嘿,程序员,我改变主意了,我不仅要吃水果的人吃最多的水果,我还要吃第三多的水果”。你是做什么的?争着写另一个查询?不,您接受相同的查询和更改 rank=1rank in (1,3) 砰!你现在有最多吃水果和第三最多吃水果(如果有的话)的水果食客。
和/或
你的老板可能会再次改变主意,说“嘿,程序员,忘了吃最多的水果吧,现在我要你吃最少的水果”你怎么办?再次紧急退出以进行新查询?不!你改变主意 descascpartition by 砰!你现在吃水果的人吃的水果最少了。
一些关于 RANK() 相当于mysql中的oracle。一点关于 RANK() 在Hive里也一样。

展开查看全部

相关问题