如何获取分组后按照某一个字段倒序的第一个值?这个sql怎么写啊

时间:2021-08-21 14:16:08
例如

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

#2


楼主是要
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

#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

这个意思啊。

#5


select * from tab where old in (select max(old) from tab group by sex)

#6


引用楼主 zlyperson 的回复:
例如

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




……






按照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



这几个。

#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

#12


引用 11 楼 hyee 的回复:
这个效率最高,因为不需要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) kee……

支持用group   那几种写法麻烦  简单才高效

#1


啥意思,看不懂,是不是按sex分组,取最小的name和最大的old
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

#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

#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

这个意思啊。

#5


select * from tab where old in (select max(old) from tab group by sex)

#6


引用楼主 zlyperson 的回复:
例如

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




……






按照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



这几个。

#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

#12


引用 11 楼 hyee 的回复:
这个效率最高,因为不需要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) kee……

支持用group   那几种写法麻烦  简单才高效