我有一个有两列的表。
create table txns( person varchar(255), fruit varchar(255) );
create table txns(
person varchar(255),
fruit varchar(255)
);
这是一个日志表。我这儿有小提琴。这是我用sql查询所能得到的。本质上,对每个人来说,这是他吃得最多的水果。我有oracle和mysql。将来,它还将部署在hadoop上(通过hive/impala等)。因此,一个非db中心的答案将是最好的。但请也提供一个数据库为中心的答案,如果有这样的唯一。
ghhaqwfi1#
下面的查询将同时在oracle和mysql中运行。
select k.person, k.fruit from( select person,fruit,count(fruit) as cnt from txns group by person,fruit) kjoin( select t.person,max(t.cnt) mxCnt from ( select person,fruit,count(fruit) as cnt from txns group by person,fruit )tgroup by t.person) son s.person = k.personand s.mxCnt = k.cnt order by k.person
select k.person, k.fruit from
(
select person,fruit,count(fruit) as cnt
from txns
group by person,fruit
) k
join
select t.person,max(t.cnt) mxCnt
from
)t
group by t.person
) s
on s.person = k.person
and s.mxCnt = k.cnt
order by k.person
vom3gejh2#
sql小提琴oracle 11g r2架构设置:
create table txns( person varchar(255), fruit varchar(255) );insert into txnsvalues ('alpha','apple');insert into txnsvalues ('charlie','cherry');insert into txnsvalues ('bravo','banana');insert into txnsvalues ('alpha','apple');insert into txnsvalues ('bravo','banana');insert into txnsvalues ('alpha','apricot');insert into txnsvalues ('bravo','berry');
insert into txns
values ('alpha','apple');
values ('charlie','cherry');
values ('bravo','banana');
values ('alpha','apricot');
values ('bravo','berry');
查询1:
with tab as (select person, fruit,count(1) cnt, max(count(1)) over (partition by person) m_cnt from txns group by person, fruit)select person, fruit, cnt, m_cnt from tab where cnt = m_cnt
with tab as (
select person, fruit,count(1) cnt,
max(count(1)) over (partition by person) m_cnt
group by person, fruit)
select person, fruit, cnt, m_cnt
from tab
where cnt = m_cnt
结果:
| PERSON | FRUIT | CNT | M_CNT ||---------|--------|-----|-------|| alpha | apple | 2 | 2 || bravo | banana | 2 | 2 || charlie | cherry | 1 | 1 |
| PERSON | FRUIT | CNT | M_CNT |
|---------|--------|-----|-------|
| alpha | apple | 2 | 2 |
| bravo | banana | 2 | 2 |
| charlie | cherry | 1 | 1 |
hmtdttj43#
对于oracle-
select x.person,x.fruitfrom ( select person, fruit, count(*) ct,rank() over (partition by person order by count(*) desc) as rank from txnsgroup by person, fruit) xwhere rank=1;
select x.person,x.fruit
from ( select person, fruit, count(*) ct,rank() over (partition by person
order by count(*) desc) as rank
group by person, fruit) x
where rank=1;
sql小提琴
你首先要为每个人找出一个特定的水果出现在table上的次数(或者水果被吃掉的次数)。这是由 person, fruit,count(*) .然后你需要找出哪个水果是最吃的人 PERSON i、 e.基本上 fruit 那是最高的 RANK 或位置,在本例中为 DESC 结束顺序 count(*) 会把吃得最多的水果放在 RANK =1人( partition by person ).一旦你完成排名,你只需要选择第一个 RANK 对于每个 Person 基本上是一个人吃得最多的水果。这是一个完美的例子甲骨文的分析功能 RANK() .
person, fruit,count(*)
PERSON
fruit
RANK
DESC
count(*)
partition by person
Person
RANK()
你的老板可能会改变主意,可能会问你“嘿,程序员,我改变主意了,我不仅要吃水果的人吃最多的水果,我还要吃第三多的水果”。你是做什么的?争着写另一个查询?不,您接受相同的查询和更改 rank=1 至 rank in (1,3) 砰!你现在有最多吃水果和第三最多吃水果(如果有的话)的水果食客。和/或你的老板可能会再次改变主意,说“嘿,程序员,忘了吃最多的水果吧,现在我要你吃最少的水果”你怎么办?再次紧急退出以进行新查询?不!你改变主意 desc 至 asc 在 partition by 砰!你现在吃水果的人吃的水果最少了。一些关于 RANK() 相当于mysql中的oracle。一点关于 RANK() 在Hive里也一样。
rank=1
rank in (1,3)
desc
asc
partition by
3条答案
按热度按时间ghhaqwfi1#
下面的查询将同时在oracle和mysql中运行。
vom3gejh2#
sql小提琴
oracle 11g r2架构设置:
查询1:
结果:
hmtdttj43#
对于oracle-
sql小提琴
“非db中心”的理念是-
你首先要为每个人找出一个特定的水果出现在table上的次数(或者水果被吃掉的次数)。这是由
person, fruit,count(*)
.然后你需要找出哪个水果是最吃的人
PERSON
i、 e.基本上fruit
那是最高的RANK
或位置,在本例中为DESC
结束顺序count(*)
会把吃得最多的水果放在RANK
=1人(partition by person
).一旦你完成排名,你只需要选择第一个
RANK
对于每个Person
基本上是一个人吃得最多的水果。这是一个完美的例子甲骨文的分析功能
RANK()
.你问为什么要用军衔?
你的老板可能会改变主意,可能会问你“嘿,程序员,我改变主意了,我不仅要吃水果的人吃最多的水果,我还要吃第三多的水果”。你是做什么的?争着写另一个查询?不,您接受相同的查询和更改
rank=1
至rank in (1,3)
砰!你现在有最多吃水果和第三最多吃水果(如果有的话)的水果食客。和/或
你的老板可能会再次改变主意,说“嘿,程序员,忘了吃最多的水果吧,现在我要你吃最少的水果”你怎么办?再次紧急退出以进行新查询?不!你改变主意
desc
至asc
在partition by
砰!你现在吃水果的人吃的水果最少了。一些关于
RANK()
相当于mysql中的oracle。一点关于RANK()
在Hive里也一样。