繁体   English   中英

SQL查询可检索组中最高点的最高项目

[英]SQL Query to retrieve highest item up to a point in a group

最好的描述方式是我有一张有他们的名字和年龄的人的表。 假设具有相同姓氏的人来自同一家庭。 我需要一个在oracle中的查询,该查询将检索每个家庭中年龄最大的列表,但不超过一定年龄。

表:人

name      surname         age
===============================
James     Smith           23
Sarah     Powell          17
Barry     Smith           31
Mark      Smith           35
Mary      Smith           18
Bob       Powell          30

如何找回每个30岁以下家庭中年龄最大的人?

我追求的结果

name      surname         age
===============================
James     Smith           23
Sarah     Powell          17
select p.*
from person p
inner join (
    select surname, max(age) as maxage
    from person 
    where age < 30
    group by surname
) pm on p.surname = pm.surname and p.age = pm.maxage

此版本只需要对数据进行一次传递:

SELECT DISTINCT
       FIRST_VALUE(name)
       OVER (PARTITION BY surname ORDER BY age DESC) name
      ,FIRST_VALUE(surname)
       OVER (PARTITION BY surname ORDER BY age DESC) surname
      ,FIRST_VALUE(age)
       OVER (PARTITION BY surname ORDER BY age DESC) age
FROM   person
WHERE  age < 30;

警告:如果打成平手(即同一家庭中两个年龄相同的人),它只会选一个。

create table f (name varchar2(32), surname varchar2(32), age number); insert into f values ('James','Smith',23); insert into f values ('Sarah','Powell',17); insert into f values ('Barry','Smith',31); insert into f values ('Mark','Smith',35); insert into f values ('Mary','Smith',18); insert into f values ('Bob','Powell',30); select * from (select name, surname, age, dense_rank() over (partition by surname order by age desc ) d_rank from f where age < 30) where d_rank = 1; NAME SURNAME AGE D_RANK Sarah Powell 17 1 James Smith 23 1

create table f (name varchar2(32), surname varchar2(32), age number); insert into f values ('James','Smith',23); insert into f values ('Sarah','Powell',17); insert into f values ('Barry','Smith',31); insert into f values ('Mark','Smith',35); insert into f values ('Mary','Smith',18); insert into f values ('Bob','Powell',30); select * from (select name, surname, age, dense_rank() over (partition by surname order by age desc ) d_rank from f where age < 30) where d_rank = 1; NAME SURNAME AGE D_RANK Sarah Powell 17 1 James Smith 23 1

create table f (name varchar2(32), surname varchar2(32), age number); insert into f values ('James','Smith',23); insert into f values ('Sarah','Powell',17); insert into f values ('Barry','Smith',31); insert into f values ('Mark','Smith',35); insert into f values ('Mary','Smith',18); insert into f values ('Bob','Powell',30); select * from (select name, surname, age, dense_rank() over (partition by surname order by age desc ) d_rank from f where age < 30) where d_rank = 1; NAME SURNAME AGE D_RANK Sarah Powell 17 1 James Smith 23 1

create table f (name varchar2(32), surname varchar2(32), age number); insert into f values ('James','Smith',23); insert into f values ('Sarah','Powell',17); insert into f values ('Barry','Smith',31); insert into f values ('Mark','Smith',35); insert into f values ('Mary','Smith',18); insert into f values ('Bob','Powell',30); select * from (select name, surname, age, dense_rank() over (partition by surname order by age desc ) d_rank from f where age < 30) where d_rank = 1; NAME SURNAME AGE D_RANK Sarah Powell 17 1 James Smith 23 1

create table f (name varchar2(32), surname varchar2(32), age number); insert into f values ('James','Smith',23); insert into f values ('Sarah','Powell',17); insert into f values ('Barry','Smith',31); insert into f values ('Mark','Smith',35); insert into f values ('Mary','Smith',18); insert into f values ('Bob','Powell',30); select * from (select name, surname, age, dense_rank() over (partition by surname order by age desc ) d_rank from f where age < 30) where d_rank = 1; NAME SURNAME AGE D_RANK Sarah Powell 17 1 James Smith 23 1

create table f (name varchar2(32), surname varchar2(32), age number); insert into f values ('James','Smith',23); insert into f values ('Sarah','Powell',17); insert into f values ('Barry','Smith',31); insert into f values ('Mark','Smith',35); insert into f values ('Mary','Smith',18); insert into f values ('Bob','Powell',30); select * from (select name, surname, age, dense_rank() over (partition by surname order by age desc ) d_rank from f where age < 30) where d_rank = 1; NAME SURNAME AGE D_RANK Sarah Powell 17 1 James Smith 23 1

create table f (name varchar2(32), surname varchar2(32), age number); insert into f values ('James','Smith',23); insert into f values ('Sarah','Powell',17); insert into f values ('Barry','Smith',31); insert into f values ('Mark','Smith',35); insert into f values ('Mary','Smith',18); insert into f values ('Bob','Powell',30); select * from (select name, surname, age, dense_rank() over (partition by surname order by age desc ) d_rank from f where age < 30) where d_rank = 1; NAME SURNAME AGE D_RANK Sarah Powell 17 1 James Smith 23 1

create table f (name varchar2(32), surname varchar2(32), age number); insert into f values ('James','Smith',23); insert into f values ('Sarah','Powell',17); insert into f values ('Barry','Smith',31); insert into f values ('Mark','Smith',35); insert into f values ('Mary','Smith',18); insert into f values ('Bob','Powell',30); select * from (select name, surname, age, dense_rank() over (partition by surname order by age desc ) d_rank from f where age < 30) where d_rank = 1; NAME SURNAME AGE D_RANK Sarah Powell 17 1 James Smith 23 1

create table f (name varchar2(32), surname varchar2(32), age number); insert into f values ('James','Smith',23); insert into f values ('Sarah','Powell',17); insert into f values ('Barry','Smith',31); insert into f values ('Mark','Smith',35); insert into f values ('Mary','Smith',18); insert into f values ('Bob','Powell',30); select * from (select name, surname, age, dense_rank() over (partition by surname order by age desc ) d_rank from f where age < 30) where d_rank = 1; NAME SURNAME AGE D_RANK Sarah Powell 17 1 James Smith 23 1


create table f (name varchar2(32), surname varchar2(32), age number); insert into f values ('James','Smith',23); insert into f values ('Sarah','Powell',17); insert into f values ('Barry','Smith',31); insert into f values ('Mark','Smith',35); insert into f values ('Mary','Smith',18); insert into f values ('Bob','Powell',30); select * from (select name, surname, age, dense_rank() over (partition by surname order by age desc ) d_rank from f where age < 30) where d_rank = 1; NAME SURNAME AGE D_RANK Sarah Powell 17 1 James Smith 23 1

create table f (name varchar2(32), surname varchar2(32), age number); insert into f values ('James','Smith',23); insert into f values ('Sarah','Powell',17); insert into f values ('Barry','Smith',31); insert into f values ('Mark','Smith',35); insert into f values ('Mary','Smith',18); insert into f values ('Bob','Powell',30); select * from (select name, surname, age, dense_rank() over (partition by surname order by age desc ) d_rank from f where age < 30) where d_rank = 1; NAME SURNAME AGE D_RANK Sarah Powell 17 1 James Smith 23 1

另请参阅:

http://www.oracle.com/technology/oramag/oracle/07-jan/o17asktom.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM