![](/img/trans.png)
[英]Retrieve most common item name and its highest price from multiple categories by one SQL query
[英]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.