name sex old
name1 1 10
name2 1 11
name3 2 12
期望得到结果
name1 1 11
name2 2 12
解释:
按照sex分组,sex=1的有两条数据,按照old倒序获得结果
name1 1 11
按照sex分组,sex=2的有一条数据,按照old倒序获得结果
name2 2 12
12 个解决方案
#1
啥意思,看不懂,是不是按sex分组,取最小的name和最大的old
select min(name) name,sex,max(old) from tab group by sex
select min(name) name,sex,max(old) from tab group by sex
#2
楼主是要
name2 1 11
name3 2 12
还是
name1 1 11
name2 2 12
name2 1 11
name3 2 12
还是
name1 1 11
name2 2 12
#3
name sex old
name1 1 10
name2 1 11
name3 2 12
期望得到结果
name2 1 11
name3 2 12
解释:
按照sex分组,sex=1的有两条数据,按照old倒序获得结果
name2 1 11
按照sex分组,sex=2的有一条数据,按照old倒序获得结果
name3 2 12
name1 1 10
name2 1 11
name3 2 12
期望得到结果
name2 1 11
name3 2 12
解释:
按照sex分组,sex=1的有两条数据,按照old倒序获得结果
name2 1 11
按照sex分组,sex=2的有一条数据,按照old倒序获得结果
name3 2 12
#4
不好意思写错了啊。
name sex old
name1 1 10
name2 1 11
name3 2 12
期望得到结果
name2 1 11
name3 2 12
解释:
按照sex分组,sex=1的有两条数据,按照old倒序获得结果
name2 1 11
按照sex分组,sex=2的有一条数据,按照old倒序获得结果
name3 2 12
这个意思啊。
name sex old
name1 1 10
name2 1 11
name3 2 12
期望得到结果
name2 1 11
name3 2 12
解释:
按照sex分组,sex=1的有两条数据,按照old倒序获得结果
name2 1 11
按照sex分组,sex=2的有一条数据,按照old倒序获得结果
name3 2 12
这个意思啊。
#5
select * from tab where old in (select max(old) from tab group by sex)
#6
按照sex分组,sex=1的有两条数据,按照old倒序获得结果
name1 1 11
按照sex分组,sex=2的有一条数据,按照old倒序获得结果
name2 2 12
select name,sex,old
from (select name,sex,old,row_number() over(partition by sex order by old desc) rn
from tb) where rn=1
--or
select name,sex,old
from tb a
where not exists(select 1 from tb b where a.sex=b.sex and a.old<b.old)
--or
select name,sex,old
from tb a
where a.old=(select max(old) from tb b where a.sex=b.sex)
--or
select name,sex,old
from tb a,(select sex,max(old) old from tb group by sex) b
where a.sex=b.sex and a.old=b.old
#7
with tb as(
select 'name1' name,1 sex,10 old from dual union all
select 'name2', 1, 11 from dual union all
select 'name3', 2, 12 from dual)
--以上为提供数据的语句
select name,sex,old
from tb a
where not exists(select 1 from tb b where a.sex=b.sex and a.old<b.old)
NAME SEX OLD
----- ---------- ----------
name2 1 11
name3 2 12
#8
麻烦问下那个效率最高啊?
select name,sex,old
from (select name,sex,old,row_number() over(partition by sex order by old desc) rn
from tb) where rn=1
--or
select name,sex,old
from tb a
where not exists(select 1 from tb b where a.sex=b.sex and a.old<b.old)
--or
select name,sex,old
from tb a
where a.old=(select max(old) from tb b where a.sex=b.sex)
--or
select name,sex,old
from tb a,(select sex,max(old) old from tb group by sex) b
where a.sex=b.sex and a.old=b.old
这几个。
select name,sex,old
from (select name,sex,old,row_number() over(partition by sex order by old desc) rn
from tb) where rn=1
--or
select name,sex,old
from tb a
where not exists(select 1 from tb b where a.sex=b.sex and a.old<b.old)
--or
select name,sex,old
from tb a
where a.old=(select max(old) from tb b where a.sex=b.sex)
--or
select name,sex,old
from tb a,(select sex,max(old) old from tb group by sex) b
where a.sex=b.sex and a.old=b.old
这几个。
#9
都差不太多吧,前两个可能会快一点
#10
oracle显示sql语句执行时间命了:set timing on ;
SQL> set timing on;
SQL> with tb as(
2 select 'name1' name,1 sex,10 old from dual union all
3 select 'name2', 1, 11 from dual union all
4 select 'name3', 2, 12 from dual)
5 select name,sex,old
6 from tb a
7 where not exists(select 1 from tb b where a.sex=b.sex and a.old<b.old)
8 /
NAME SEX OLD
----- ---------- ----------
name2 1 11
name3 2 12
Executed in 0 seconds
SQL> /
NAME SEX OLD
----- ---------- ----------
name2 1 11
name3 2 12
Executed in 0.016 seconds
SQL>
#11
这个效率最高,因为不需要where:
with tb as(
select 'name1' name,1 sex,10 old from dual union all
select 'name2', 1, 11 from dual union all
select 'name3', 2, 12 from dual)
--以上为提供数据的语句
select max(name) keep(dense_rank last order by old) name,
sex,
max(old)
from tb
group by sex
with tb as(
select 'name1' name,1 sex,10 old from dual union all
select 'name2', 1, 11 from dual union all
select 'name3', 2, 12 from dual)
--以上为提供数据的语句
select max(name) keep(dense_rank last order by old) name,
sex,
max(old)
from tb
group by sex
#12
支持用group 那几种写法麻烦 简单才高效
#1
啥意思,看不懂,是不是按sex分组,取最小的name和最大的old
select min(name) name,sex,max(old) from tab group by sex
select min(name) name,sex,max(old) from tab group by sex
#2
楼主是要
name2 1 11
name3 2 12
还是
name1 1 11
name2 2 12
name2 1 11
name3 2 12
还是
name1 1 11
name2 2 12
#3
name sex old
name1 1 10
name2 1 11
name3 2 12
期望得到结果
name2 1 11
name3 2 12
解释:
按照sex分组,sex=1的有两条数据,按照old倒序获得结果
name2 1 11
按照sex分组,sex=2的有一条数据,按照old倒序获得结果
name3 2 12
name1 1 10
name2 1 11
name3 2 12
期望得到结果
name2 1 11
name3 2 12
解释:
按照sex分组,sex=1的有两条数据,按照old倒序获得结果
name2 1 11
按照sex分组,sex=2的有一条数据,按照old倒序获得结果
name3 2 12
#4
不好意思写错了啊。
name sex old
name1 1 10
name2 1 11
name3 2 12
期望得到结果
name2 1 11
name3 2 12
解释:
按照sex分组,sex=1的有两条数据,按照old倒序获得结果
name2 1 11
按照sex分组,sex=2的有一条数据,按照old倒序获得结果
name3 2 12
这个意思啊。
name sex old
name1 1 10
name2 1 11
name3 2 12
期望得到结果
name2 1 11
name3 2 12
解释:
按照sex分组,sex=1的有两条数据,按照old倒序获得结果
name2 1 11
按照sex分组,sex=2的有一条数据,按照old倒序获得结果
name3 2 12
这个意思啊。
#5
select * from tab where old in (select max(old) from tab group by sex)
#6
按照sex分组,sex=1的有两条数据,按照old倒序获得结果
name1 1 11
按照sex分组,sex=2的有一条数据,按照old倒序获得结果
name2 2 12
select name,sex,old
from (select name,sex,old,row_number() over(partition by sex order by old desc) rn
from tb) where rn=1
--or
select name,sex,old
from tb a
where not exists(select 1 from tb b where a.sex=b.sex and a.old<b.old)
--or
select name,sex,old
from tb a
where a.old=(select max(old) from tb b where a.sex=b.sex)
--or
select name,sex,old
from tb a,(select sex,max(old) old from tb group by sex) b
where a.sex=b.sex and a.old=b.old
#7
with tb as(
select 'name1' name,1 sex,10 old from dual union all
select 'name2', 1, 11 from dual union all
select 'name3', 2, 12 from dual)
--以上为提供数据的语句
select name,sex,old
from tb a
where not exists(select 1 from tb b where a.sex=b.sex and a.old<b.old)
NAME SEX OLD
----- ---------- ----------
name2 1 11
name3 2 12
#8
麻烦问下那个效率最高啊?
select name,sex,old
from (select name,sex,old,row_number() over(partition by sex order by old desc) rn
from tb) where rn=1
--or
select name,sex,old
from tb a
where not exists(select 1 from tb b where a.sex=b.sex and a.old<b.old)
--or
select name,sex,old
from tb a
where a.old=(select max(old) from tb b where a.sex=b.sex)
--or
select name,sex,old
from tb a,(select sex,max(old) old from tb group by sex) b
where a.sex=b.sex and a.old=b.old
这几个。
select name,sex,old
from (select name,sex,old,row_number() over(partition by sex order by old desc) rn
from tb) where rn=1
--or
select name,sex,old
from tb a
where not exists(select 1 from tb b where a.sex=b.sex and a.old<b.old)
--or
select name,sex,old
from tb a
where a.old=(select max(old) from tb b where a.sex=b.sex)
--or
select name,sex,old
from tb a,(select sex,max(old) old from tb group by sex) b
where a.sex=b.sex and a.old=b.old
这几个。
#9
都差不太多吧,前两个可能会快一点
#10
oracle显示sql语句执行时间命了:set timing on ;
SQL> set timing on;
SQL> with tb as(
2 select 'name1' name,1 sex,10 old from dual union all
3 select 'name2', 1, 11 from dual union all
4 select 'name3', 2, 12 from dual)
5 select name,sex,old
6 from tb a
7 where not exists(select 1 from tb b where a.sex=b.sex and a.old<b.old)
8 /
NAME SEX OLD
----- ---------- ----------
name2 1 11
name3 2 12
Executed in 0 seconds
SQL> /
NAME SEX OLD
----- ---------- ----------
name2 1 11
name3 2 12
Executed in 0.016 seconds
SQL>
#11
这个效率最高,因为不需要where:
with tb as(
select 'name1' name,1 sex,10 old from dual union all
select 'name2', 1, 11 from dual union all
select 'name3', 2, 12 from dual)
--以上为提供数据的语句
select max(name) keep(dense_rank last order by old) name,
sex,
max(old)
from tb
group by sex
with tb as(
select 'name1' name,1 sex,10 old from dual union all
select 'name2', 1, 11 from dual union all
select 'name3', 2, 12 from dual)
--以上为提供数据的语句
select max(name) keep(dense_rank last order by old) name,
sex,
max(old)
from tb
group by sex
#12
支持用group 那几种写法麻烦 简单才高效