SQL-запрос для получения самого высокого элемента до точки в группе - PullRequest
0 голосов
/ 11 марта 2010

Лучший способ описать это - у меня есть таблица людей с их именами и возрастами. Предположим, что люди с одинаковой фамилией принадлежат к одной семье. Мне нужен запрос в 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

Ответы [ 3 ]

3 голосов
/ 11 марта 2010
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
0 голосов
/ 11 марта 2010

</p> <p>create table f (name varchar2(32), surname varchar2(32), age number);</p> <p>insert into f values ('James','Smith',23);</p> <p>insert into f values ('Sarah','Powell',17);</p> <p>insert into f values ('Barry','Smith',31);</p> <p>insert into f values ('Mark','Smith',35);</p> <p>insert into f values ('Mary','Smith',18);</p> <p>insert into f values ('Bob','Powell',30);</p> <p>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;</p> <p>NAME SURNAME AGE D_RANK</p> <hr> <p>Sarah Powell 17 1</p> <p>James Smith 23 1</p> <p>

Также см .:

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

0 голосов
/ 11 марта 2010

Для этой версии потребуется только один проход данных:

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;

Предупреждение: в случае связи (то есть двух человек с одинаковым возрастом в одной семье), он просто выберет один.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...